使这个正则表达式使用负前瞻

时间:2017-03-10 17:44:33

标签: php regex regex-negation

我正在做一个html和bbcode解析器。我有这个正则表达式从内到外捕获重复的组:

$re = '/<b>((?:(?!<\/?b>).)*)<\/b>/is';

但我希望能够匹配<b class=”string”>text</b>或其他任何属性。 我已经通过使用:

来做到这一点
'/<b((\s)+?.*?)?\>(.*?)<\/b>/is'

但现在当尝试加入他们并添加新的负面预测时,我无法使其发挥作用。

我尝试了'/<b((\s)+?.*?)?\((?:(?!</?b((\s)+?.*?)?>).)*)<\/b>/is',但无法正常工作,为此:

<b class=”string2”><b class=”string”>text</b></b>

它与第一个b标签匹配,但不应该。我想得到:

<b class=”string2”>[b]text[/b]</b>

1 个答案:

答案 0 :(得分:1)

这将全部&lt; b> [b]:

<?php

$str = '<b>test</b><b class=”string2”><b class=”string”>text</b></b>';
$prev = '';
while ($prev != $str) {
    $prev = $str;
    $str = preg_replace("/<b[ a-z0-9\"'\=”]*?>(.*?)<\/b>/is","[b]$1[/b]",$str);
}
echo $str;

?>