有没有一种方法可以在regexp中找到自定义标记,即匹配
{a}sometext{/a} 以及
{c=#fff}sometext{/c} 这样它就能找到整个内部内容块?问题是sometext可能有另一个标记,如下所示:
{a=http://www.google.com}{b}Hello, world{/b}{/a} 我能想出的唯一解决方案将匹配{a...到.../b}当我想{a...要.../a}是否有一个单一的regexp解决方案,或者最好匹配开始,然后使用另一种方法从备份中找到结尾,并以这种方式获取它?我使用的是PHP5.2,所以我有必要的所有选项。
发布于 2010-05-17 10:56:33
听起来你正在尝试做MediaWiki已经用wiki标记语言做过的事情。我建议使用他们的解析器和标记,或者如果您选择使用自己的解析器和标记,您可能会从他们如何做到这一点上找到灵感。
Manual for Parser.php
Source for Parser.php
发布于 2010-05-17 10:51:00
这是可行的:
$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来查看)。
https://stackoverflow.com/questions/2846372
复制相似问题