繁体   English   中英

使用 php 正则表达式解析块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM