在尝试使用正则表达式模式数组解析 BBCode 时,出现错误“编译失败:偏移量 11 处的括号不匹配”。
我不知道
offset 11
是什么意思,我检查了所有括号,没有未闭集。
这是我的代码:
function bbParse($string) {
$codes = array(
'/\[b\](.+?)\[\/b\]/' => '<b>$1</b>',
'/\[h2\](.+?)\[\/h2\]/' => '<h2>$1</h2>',
'/\[h3\](.+?)\[\/h3\]/' => '<h3>$1</h3>',
'/\[p\](.+?)\[\/p\]/' => '<p>$1</p>',
'/\[quote\](.+?)\[\/quote\]/' => '<blockquote>$1</blockquote>',
'/\[img\](.+?)\[\/img\]/' => '<img src=\'$1\' alt=\'Image Not Available\'>',
'/\[url=\(.+?)\](.+?)\[\/url\]/' => '<a href=\'$1\'>$2</a>'
);
$string = preg_replace(array_keys($codes), array_values($codes), $string);
return $string;
}
/\[url=\(.+?)\](.+?)\[\/url\]/
此正则表达式中的第一个分组括号被转义,使其成为文字括号字符。因此,结束括号没有匹配的左括号。您需要删除第一个括号前面的
\
,使其成为:
/\[url=(.+?)\](.+?)\[\/url\]/
看来最后一个条目是罪魁祸首。开头的父级用反斜杠转义,这可能不是您想要的。
在这里你逃避了一个
(
,所以它失败了,因为没有(
到下一个)
:
'/\[url=\(.+?)\](.+?)\[\/url\]/' => '<a href=\'$1\'>$2</a>'