我需要一些帮助与我的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