使用PHP解释BBCode,但无法使用str_replace


Using PHP to interpret BBCode, but unable to use str_replace

我目前正在使用一个PHP类来解释通过表单输入的BBCode,以便在用户访问其页面时,它能正确显示在用户的页面上。

然而,我在从BBCode到HTML的转换中遇到了一个障碍,因为我希望它能转换以下

[wiki]Article Title Here[/wiki]

<a href="http://example.com/article_title_here">Article Title Here</a>

但它目前只转换为

<a href="http://example.com/article title here">Article Title Here</a>

我曾尝试使用str_replace用下划线重新排列空格,但目前似乎不太适用。

我发布了下面的代码作为参考,如果它有帮助的话,我目前正在运行PHP 7.0.4。

    <?php
class bbcode {
    public static function tohtml($text,$advanced=FALSE,$charset='utf-8'){
        $basic_bbcode = array(
            '[b]', '[/b]',
            '[i]', '[/i]',
            '[u]', '[/u]',
        );
        $basic_html = array(
            '<b>', '</b>',
            '<i>', '</i>',
            '<u>', '</u>',
            '<s>', '</s>',
        );
        $text = str_replace($basic_bbcode, $basic_html, $text);
        if ($advanced){
            $advanced_bbcode = array(
                '#'[wiki](.+)'[/wiki]#Usi',
                '#'[email](['w'.'-]+@[a-zA-Z0-9'-]+'.?[a-zA-Z0-9'-]*'.'w{1,4})'[/email]#Usi',
                '#'[email=(['w'.'-]+@[a-zA-Z0-9'-]+'.?[a-zA-Z0-9'-]*'.'w{1,4})](.+)'[/email]#Usi',
                '#'[img](.+)'[/img]#Usi',
                '#'[img=(.+)](.+)'[/img]#Usi',
                '#'[code]('r'n)?(.+?)('r'n)?'[/code]#si',
                '#'[youtube]http://[a-z]{0,3}.youtube.com/watch'?v=([0-9a-zA-Z]{1,11})'[/youtube]#Usi',
                '#'[youtube]([0-9a-zA-Z]{1,11})'[/youtube]#Usi',
            );
            $advanced_html = array(
                '<a target="_blank" href="http://example.com/$1">$1</a>',
                '<a href="mailto: $1">$1</a>',
                '<a href="mailto: $1">$2</a>',
                '<img src="$1" alt="$1" />',
                '<img src="$1" alt="$2" />',
                '<div class="code">$2</div>',
                '<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>',
                '<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>',
            );
            $text = preg_replace($advanced_bbcode, $advanced_html,$text);
        }
        return bbcode::nl2br($text);
    }
    public static function remove($text){
        $text  = htmlspecialchars($text, ENT_QUOTES,$charset);
        return $text;
    }
    public static function nl2br($var){
        return str_replace(array('''r''n',''r''n','r''n',''r'n', ''n', ''r'), '<br />', nl2br($var));
    }
}
?>

非常感谢您的帮助。

空白可能是utf-8编码的。使用echo bin2hex($url)检查现有的字符串,找出它包含的字节数。你也可以试试这个:

str_replace("'xE2'x80'xAF", "_", $url)

这将用下划线替换ZERO-WIDTH SPACE(UTF-8编码E2 80 AF)。