带有转义选项的PHP bbcode解析器

时间:2017-09-28 07:55:56

标签: php regex parsing preg-replace bbcode

我有这个功能:

function parse_bbcode($str = ''){

    $find = array(
        "'\[b\](.*?)\[/b\]'is",
        "'\[i\](.*?)\[/i\]'is",
        "'\[u\](.*?)\[/u\]'is",
        "'\[s\](.*?)\[/s\]'is",
        "'\[img\](.*?)\[/img\]'i",
        "'\[url\](.*?)\[/url\]'i",
        "'\[url=(.*?)\](.*?)\[/url\]'i",
        "'\[link\](.*?)\[/link\]'i",
        "'\[link=(.*?)\](.*?)\[/link\]'i"
    );

    $replace = array(
        '<strong>\\1</strong>',
        '<em>\\1</em>',
        '<u>\\1</u>',
        '<s>\\1</s>',
        '<img src="\\1" alt="" width="100%" />',
        '<a href="\\1">\\1</a>',
        '<a href="\\1">\\2</a>',
        '<a href="\\1">\\1</a>',
        '<a href="\\1">\\2</a>'
    );

    return preg_replace($find, $replace, $str);

}

用于解析bbcodes。

如何为bbcodes添加可选性转义?

示例:

感谢[b]你[/ b]迈克! - 感谢 Mike!

谢谢\ [b]你[/ b]迈克! - 感谢[b]你[/ b]迈克!

1 个答案:

答案 0 :(得分:0)

看起来我做到了!

function parse_bbcode($str = ''){

    $find = array(
        "'([^\\\\])\[b\](.*?)([^\\\\])\[/b\]'is",
        "'\[i\](.*?)\[/i\]'is",
        "'\[u\](.*?)\[/u\]'is",
        "'\[s\](.*?)\[/s\]'is",
        "'\[img\](.*?)\[/img\]'i",
        "'\[url\](.*?)\[/url\]'i",
        "'\[url=(.*?)\](.*?)\[/url\]'i",
        "'\[link\](.*?)\[/link\]'i",
        "'\[link=(.*?)\](.*?)\[/link\]'i",
        "'([^\\\\])\\\\\['i"
    );

    $replace = array(
        '\\1<strong>\\2\\3</strong>',
        '<em>\\1</em>',
        '<u>\\1</u>',
        '<s>\\1</s>',
        '<img src="\\1" alt="" width="100%" />',
        '<a href="\\1">\\1</a>',
        '<a href="\\1">\\2</a>',
        '<a href="\\1">\\1</a>',
        '<a href="\\1">\\2</a>',
        '\\1['
    );

    return preg_replace($find, $replace, $str);

}

(这个exaple只逃避[b]标签!)