检查用户输入的链接语法

时间:2011-08-30 02:12:22

标签: php mysql

我有一个网站,用户可以在其中输入评论和说明。我也允许他们输入链接。我使用strip_tags作为链接的例外。我还通过一个简单的string_replace添加rel="nofollow"

问题是,如果用户在开始标记的末尾留下双引号,则会混淆html。有关如何检查或修复错误链接语法的任何建议?

$comment = $_POST['comment'];
$comment = strip_tags($comment,"<a>");
$comment = str_replace('<a','<a rel="nofollow"',$comment);
$comment = mysql_real_escape_string($comment);

并在输出时

$ comment = stripslashes($ comment);

echo $ comment;

问题是当用户添加<a href="www.blah.com>并忘记最后一个双引号时,这会混淆注释div显示的方式。

1 个答案:

答案 0 :(得分:5)

以下是您必须做的事情:

function fixLink($link) {
    $link = str_replace(array('<a', '"', '</a>'), '', $link);
    $link = str_replace(
        array('=', '>', ' '),
        array('="', '">', '" '),
        $link);
    return '<a rel="nofollow' . $link . '</a>';
}    

echo fixLink('<a href="/index.html>asd</a>') . "\n";
echo fixLink('<a class="awesome" href="/index.html>asd</a>') . "\n";
echo fixLink('<a href="/index.html class="awesome">asd</a>') . "\n";
echo fixLink('<a target="_blank" href="/index.html class="awesome">asd</a>') . "\n";
echo fixLink('<a target="_blank" href="/index.html class="awesome>asd</a>') . "\n";
echo fixLink('<a target="_blank" href="/index.html target="_blank" class="awesome">asd</a>') . "\n";
echo fixLink('<a href="/index.html class=awesome">asd</a>') . "\n";

那将输出:

<a rel="nofollow" href="/index.html">asd</a>
<a rel="nofollow" class="awesome" href="/index.html">asd</a>
<a rel="nofollow" href="/index.html" class="awesome">asd</a>
<a rel="nofollow" target="_blank" href="/index.html" class="awesome">asd</a>
<a rel="nofollow" target="_blank" href="/index.html" class="awesome">asd</a>
<a rel="nofollow" target="_blank" href="/index.html" target="_blank" class="awesome">asd</a>
<a rel="nofollow" href="/index.html" class="awesome">asd</a>