正则表达式和BBCodes

时间:2011-04-26 18:53:58

标签: php regex bbcode

过去我没有使用过bbcodes或regex,但我找到了一些帮助我找出基本方法的教程。我想使用某种方法,所以我结合了这些教程中的一些方法来获得我想要的东西。唯一的问题是它不起作用。我得到一个错误,说“编译失败:在偏移11处无法匹配的括号”我不知道偏移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;


}</code>

3 个答案:

答案 0 :(得分:3)

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

此正则表达式中的第一个分组paren被转义,使其成为字面括号字符。因此,收盘时没有匹配的开盘。您需要删除第一个括号前面的\,使其成为:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您在此处转义(,因此失败,因为下一个(没有)

'/\[url=\(.+?)\](.+?)\[\/url\]/' => '<a href=\'$1\'>$2</a>'