PHP preg_match_all:括号内的括号标签

时间:2014-04-11 14:22:09

标签: php regex preg-match-all

我有自定义标签,例如

{{tag-name}}
<table>
  <tr>
    {{loop}}<td>text</td> ... {{/loop}}
  </tr>
</table>
{{/tag-name}}

我想在括号标记中提取HTML代码。

我在preg_match_all中使用这个模式:

/{\{.*?\}\}((?:(?!\{\{/(.*?)\}\}).)*)\{\{\/.*?\}\}/s

但它不起作用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果{{tag-name}}不是任意嵌套的,那么这个正则表达式应该这样做:

$pattern = '~{{([^}]+)}}(.*?){{/\1}}~s';

See on regex101.com

在第一个带括号的组{{([^}]+)}}中捕获标记名称并匹配结束{{/\1}}

第二个带括号的小组(.*?)的捕获匹配将在$out[2]

使用s (PCRE_DOTALL) modifier*? lazy quantifier


如果需要,请与preg_matchpreg_match_all一起使用,例如

if(preg_match_all($pattern, $input, $out)) {
   var_dump($out);
}

请参阅eval.in for an example

答案 1 :(得分:0)

使用preg_match_all和"/\{\{.[^\}]+\}\}(.+)\{\{\/.+\}\}/s"正则表达式获取父亲的标签; 问题是你的标签在另一个标签内。

http://php.net/manual/en/class.domdocument.php看看DomDocument是通过简单的方法调用轻松加载文档,在文档中获取标签和标记内容......