bbcode的正则表达式似乎在长句子上失败了


Regex for bbcode seems to fail on long sentences

我需要一些帮助与我的BBCode替换。现在我正在做以下工作来查找和替换bbcode:

    $bbMatch[0] =   '/('[b'])(.*)('['/b'])/';
    $bbReplace[0] = '<strong>${2}</strong>';
    $bbMatch[1] =   '/('[url'])(.*)('['/url'])/';
    $bbReplace[1] = '[url=${2}]${2}[/url]';
    $bbMatch[2] =   '/('[url=)(.+)('])(.+)('['/url'])/';
    $bbReplace[2] = '<a href="${2}" target="_blank">${4}</a>';
    $bbMatch[3] =   '/('[s'])(.*)('['/s'])/';
    $bbReplace[3] = '<span style="text-decoration: line-through;">${2}</span>';
    $bbMatch[4] =   '/('[u'])(.*)('['/u'])/';
    $bbReplace[4] = '<span style="text-decoration: underline;">${2}</span>';
    $bbMatch[5] =   '/('[i'])(.*)('['/i'])/';
    $bbReplace[5] = '<em>${2}</em>';
    // Remove bad characters
    $text = htmlspecialchars($text);
    // Parse Smilies
    $text = preg_replace($bbMatch, $bbReplace, $text);

这里的问题是,当一个大句子通过this运行时,它无法找到结束标记。它会显示这是一个例子:

一些斜体文本[/i]这里有一些单词[i]也是斜体文本

可以看到,它显示了第一个的结束标记,第二个的开始标记。我该如何解决这个问题?

你的问题是regex默认是贪婪的。所以它会抓取第一个[i]和最后一个[/i]之间的所有元素。由于您告诉它在这些字符集之间抓取通配符,并且它试图抓取尽可能多的字符,只要周围有[i]..[/i],它就会很高兴地抓取[/i] and [i]。你只需要在*之后添加一个?,使它不贪婪的EX;

$bbMatch[5] =   '/('[i'])(.*?)('['/i'])/';
$bbReplace[5] = '<em>${2}</em>';

你会想要像那样改变你所有的正则表达式,而不仅仅是你的斜体。

下面是一个贪婪正则表达式和非贪婪正则表达式的例子:http://www.exampledepot.com/egs/java.util.regex/Greedy.html