我正在尝试用PHP写一个(我认为)非常简单的RegEx,但它不起作用.
基本上我有一个像这样定义的块:
%%%%blockname%%%%
stuff goes here
%%%%/blockname%%%%
我对RegEx并不擅长,但这是我试过的:
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/i',$input,$matches);
它返回一个包含4个空条目的数组.
我想它除了实际工作之外还需要某种指针用于第三场比赛,因为它应该等于第一场比赛?
请赐教:)
解决方法:
您需要允许点匹配换行符,并允许^和$匹配行的开头和结尾(而不仅仅是整个字符串):
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/sm',$input,$matches);
s(单行)选项使点匹配任何字符,包括换行符.
m(多行)选项允许^和$在行的开头和结尾匹配.
正则表达式中不需要i选项,因为其中没有区分大小写的字符.
然后,回答问题的第二部分:如果在两种情况下blockname都相同,那么您可以通过使用对第一个捕获组的反向引用来使其明确:
preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);
标签:php,regex,block
来源: https://codeday.me/bug/20190726/1542744.html