Php 在Regexp中查找打开和关闭标记
有没有办法在regexp中找到自定义标记,即匹配Php 在Regexp中查找打开和关闭标记,php,regex,Php,Regex,有没有办法在regexp中找到自定义标记,即匹配 {a}sometext{/a} 以及 {c=#fff}sometext{/c} 这样它就能找到整个内部内容块?问题是sometext可能有另一个标记,如中所示: {a=http://www.google.com}{b}Hello, world{/b}{/a} 我能想出的唯一解决方案是从{a…到…/b}匹配,当我想要{a…到…/a}时,是否有一个单一的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,所以我有所有必要的选项。这可以:
$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\\}~';
但在这种情况下,我不知道如何匹配任意深度的内部标记。
结束编辑
但是,我强烈建议不要为此使用正则表达式。我建议您迭代字符串,每次迭代一个数组,并使用一个辅助堆栈跟踪您找到的标记(使用和用于peek)。这样做:
$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\\}~';
但在这种情况下,我不知道如何匹配任意深度的内部标记。
结束编辑
但是,我强烈建议不要为此使用正则表达式。我建议您迭代字符串,每次迭代一个数组,并使用一个辅助堆栈来跟踪您找到的标记(使用和用于peek)。听起来您正在尝试做MediaWiki已经用wiki标记语言做的事情。我建议您使用他们的解析器和标记,或者如果您选择使用自己的解析器和标记,您可能会从他们的操作中获得灵感
听起来您正在尝试做MediaWiki使用wiki标记语言已经做过的事情。我建议您使用他们的解析器和标记,或者如果您选择使用自己的解析器和标记,您可能会从他们的操作中获得灵感
谢谢你的正则表达式,但我不太明白你的建议。如果它能更有效,那么我很乐意使用它。你知道关于它的任何文章吗?谷歌搜索“parser tag nested stack”或类似的内容,你会找到关于如何解析嵌套标记的文章。谢谢你的正则表达式,但我不太理解你的建议。如果它能更有效,那么我很乐意使用它。你知道关于它的任何文章吗?谷歌搜索“parser tag nested stack”或类似的内容,你会找到关于如何解析嵌套标记的文章。这正是我想要找到的,谢谢!我正在尝试推出我自己的,因为学习经验,以及因为我只想要某些功能。这正是我试图找到的,谢谢!我正试图推出自己的,为学习经验,以及因为我只想要某些功能。