使用php正则表达式解析块

Kok*_*kos 3 php regex block

我正在尝试用PHP写一个(我认为)非常简单的RegEx,但它不起作用.基本上我有一个像这样定义的块:

%%%%blockname%%%%
stuff goes here
%%%%/blockname%%%%
Run Code Online (Sandbox Code Playgroud)

我对RegEx并不擅长,但这是我试过的:

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/i',$input,$matches);
Run Code Online (Sandbox Code Playgroud)

它返回一个包含4个空条目的数组.

我想它除了实际工作之外还需要某种指针用于第三场比赛,因为它应该等于第一场比赛?

请赐教:)

Tim*_*ker 8

您需要允许点匹配换行符,并允许^和匹配行$的开头和结尾(而不仅仅是整个字符串):

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/sm',$input,$matches);
Run Code Online (Sandbox Code Playgroud)

s(单线)选项使点匹配包括换行符的任何字符.

所述m(多线)选项允许^$匹配在启动和线的端部.

i正则表达式中不需要该选项,因为其中没有区分大小写的字符.

然后,回答问题的第二部分:如果blockname在两种情况下都相同,那么您可以通过使用对第一个捕获组的反向引用来明确说明:

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);
Run Code Online (Sandbox Code Playgroud)