有没有办法在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,所以我有所有需要的选项。
答案 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_push,array_pop和end来查看。 / p>
答案 1 :(得分:1)
听起来你正在尝试做MediaWiki已经使用wiki标记语言做的事情。我建议使用他们的解析器和他们的标记,或者如果你选择自己动手,你可以从看到他们如何做到这一点找到灵感。