PHP - 使用preg_replace在链接之前放置http://

时间:2013-06-20 09:35:14

标签: php preg-replace bbcode

我有一个bbCode函数:

function bbCode($str)
{
    $values = array(
      '@\[link="(.*?)"\](.*?)\[\/link\]@i' => '<a href="$1">$2</a>'

    );
    return preg_replace(array_keys($values), array_values($values), $str);
}

效果很好,但如果用户输入,例如[link =&#34; google.com&#34;] Something [/ link],结果将是

<a href="google.com">Something</a>

这将返回 www.mywebsite.com/google.com 我怎么能防止这种情况发生?

2 个答案:

答案 0 :(得分:0)

您可以在http://

前加上前缀
function bbCode($str)
{
$values = array(
  '@\[link="[http:\/\/]*(.*?)"\](.*?)\[\/link\]@i' => '<a href="http://$1">$2</a>'
);
return preg_replace(array_keys($values), array_values($values), $str);
}

答案 1 :(得分:0)

我认为您应该以这种方式检查有效的网址:

function bbCode($str)
{   
    $new = preg_replace_callback('@\[link="(.*?)"\](.*?)\[\/link\]@i', function($matches){
        $url = $matches[1] ;
        $text = $matches[2] ;

        if (filter_var($url, FILTER_VALIDATE_URL) === FALSE){
            $url = "http://{$url}" ;
        }

        return "<a href='{$url}'>{$text}</a>" ;
    }, $str);

    return $new ;
}


$code = '[link="google.com"]TEXT[/link]' ;
echo bbCode($code) ;