我正在尝试用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个空条目的数组.
我想它除了实际工作之外还需要某种指针用于第三场比赛,因为它应该等于第一场比赛?
请赐教:)
您需要允许点匹配换行符,并允许^和匹配行$的开头和结尾(而不仅仅是整个字符串):
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)