Php bbcode的正则表达式似乎在长句上失败了
我需要一些帮助来替换我的BBCode。现在,我正在执行以下操作以查找和替换bbcode:Php bbcode的正则表达式似乎在长句上失败了,php,regex,Php,Regex,我需要一些帮助来替换我的BBCode。现在,我正在执行以下操作以查找和替换bbcode: $bbMatch[0] = '/(\[b\])(.*)(\[\/b\])/'; $bbReplace[0] = '<strong>${2}</strong>'; $bbMatch[1] = '/(\[url\])(.*)(\[\/url\])/'; $bbReplace[1] = '[url=${2}]${2}[/url]'; $b
$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);
$bbMatch[0]='/(\[b\])(.*)(\[\/b\])/;
$bbReplace[0]='${2}';
$bbMatch[1]='/(\[url\])(.*)(\[\/url\])/';
$bbReplace[1]='[url=${2}]${2}[/url]';
$bbMatch[2]='/(\[url=)(.+)(\])(.+)(\[\/url\])/';
$bbReplace[2]='';
$bbMatch[3]='/(\[s\])(.*)(\[\/s\])/';
$bbReplace[3]='${2}';
$bbMatch[4]='/(\[u\])(.*)(\[\/u\])/';
$bbReplace[4]='${2}';
$bbMatch[5]='/(\[i\])(.*)(\[\/i\])/';
$bbReplace[5]='${2}';
//删除坏字符
$text=htmlspecialchars($text);
//解析笑脸
$text=preg_replace($bbMatch,$bbReplace,$text);
这里的问题是,当一个大的句子在这里运行时,它找不到结束标记。这将表明这是一个例子:
“一些斜体文本[/i]和此处的一些单词[i]也是斜体文本
如您所见,它显示了第一个的结束标记和第二个的开始标记。我该如何解决这个问题?您的问题是默认情况下正则表达式是贪婪的。因此它将抓取第一个
[i]
和最后一个[/i]之间的所有内容
。既然你告诉它在这些字符集之间抓取通配符,并且它试图抓取尽可能多的通配符,它就会很乐意抓取[/i]和[i]
,只要周围有[i]..[/i]
。你只需要在*
之后添加一个?
,使它不贪婪
$bbMatch[5] = '/(\[i\])(.*?)(\[\/i\])/';
$bbReplace[5] = '<em>${2}</em>';
$bbMatch[5]='/(\[i\])(.*)(\[\/i\])/;
$bbReplace[5]='${2}';
顺便说一句,你会想改变你所有的正则表达式,而不仅仅是你的斜体
下面是贪婪与非贪婪正则表达式的一个例子:这似乎解决了我的大多数问题。接下来,我注意到当结束标记与开始标记不在同一行时,整个bbcode不匹配。知道如何解决吗?@Dave:放下你的正则表达式,改为签出。@Dave在你所有的结束
/
l之后添加一个m
ike:“/(\[i\])(.*)(\[\/i\]))/m'
。这使得正则表达式是多行的。@Dave,hakre所说的也是有效的。你不能单独用正则表达式解析BB代码,因为BB代码不是一种常规语言。@Dave Siegel:除了编写PHP的PECL扩展外,还有其他方法。还有一篇很好的文章解释了为什么正则表达式不起作用/或者什么不起作用,并列出了alternaBBCODE及更多信息的示例: