使用正则表达式解析 BBCode 文本时出现“编译失败:括号不匹配”错误

问题描述 投票:0回答:3

在尝试使用正则表达式模式数组解析 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;
}
php regex preg-replace text-parsing bbcode
3个回答
3
投票

/\[url=\(.+?)\](.+?)\[\/url\]/

此正则表达式中的第一个分组括号被转义,使其成为文字括号字符。因此,结束括号没有匹配的左括号。您需要删除第一个括号前面的

\
,使其成为:

/\[url=(.+?)\](.+?)\[\/url\]/


1
投票

看来最后一个条目是罪魁祸首。开头的父级用反斜杠转义,这可能不是您想要的。


1
投票

在这里你逃避了一个

(
,所以它失败了,因为没有
(
到下一个
)

'/\[url=\(.+?)\](.+?)\[\/url\]/' => '<a href=\'$1\'>$2</a>'
© www.soinside.com 2019 - 2024. All rights reserved.