在Regex中查找打开和结束标记

时间:2010-05-17 02:38:09

标签: php regex

有没有办法在regexp中找到自定义标签I.e.匹配

{a}sometext{/a}  

以及

{c=#fff}sometext{/c}  

这样它就能找到整个内部内容块?问题是sometext可能有另一个标签,如:

{a=http://www.google.com}{b}Hello, world{/b}{/a}  

当我想要{a ... to ... / a}有一个正则表达式解决方案时,我能提出的唯一解决方案将匹配{a ...到... / b}最好匹配开始,然后使用另一种方法从备份中找到结束,并以这种方式抓住它?我正在使用PHP 5.2,所以我有所有需要的选项。

2 个答案:

答案 0 :(得分:2)

这有效:

$subject = 'bla bla{a=http://www.google.com}{b}Hello, world{/b}{/a} bla';
$regex = '~\\{a(?:=[^}]+)?\\}(.*?)\\{/a\\}~';
preg_match($regex, $subject, $matches);
var_dump($matches);

给出:

array(2) {
  [0]=>
  string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}"
  [1]=>
  string(19) "{b}Hello, world{/b}"
}

开始编辑 你可以通过反向引用使正则表达式更加通用

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~';

但在这种情况下,我不知道如何匹配任意深度的内部标签。 结束编辑

但是,我强烈建议不要为此目的使用正则表达式。我建议你迭代字符串,一次一个数组并使用辅助堆栈来跟踪你找到的标签(使用array_pusharray_popend来查看。 / p>

答案 1 :(得分:1)

听起来你正在尝试做MediaWiki已经使用wiki标记语言做的事情。我建议使用他们的解析器和他们的标记,或者如果你选择自己动手,你可以从看到他们如何做到这一点找到灵感。

Manual for Parser.php

Source for Parser.php