[英]Parse block with php regex
我正在尝试使用 PHP 编写一个(我认为)非常简单的正则表达式,但它不起作用。 基本上我有一个这样定义的块:
%%%%blockname%%%%
stuff goes here
%%%%/blockname%%%%
我不擅长正则表达式,但这是我尝试过的:
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 的内置令牌解析器来执行此操作。 http://php.net/manual/en/function.token-get-all.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.