删除javascript链接

时间:2013-06-20 12:50:45

标签: php regex

我正在寻找能够用<a href="javascript://potentiallybadstuff"> Link </a>替换所有链接的正则表达式警告。到目前为止,我一直在玩,但没有成功!我一直对正则表达式不好,有人能指出我正确的方向吗?到目前为止我有这个:

编辑:人们说不使用正则表达式 - HTML将是降价解析器的输出,其中所有HTML标记都在标记中被剥离。因此,我知道所有链接的输出将按照上述格式进行格式化,因此在这种特定情况下,正则表达式肯定是一个很好的工具。我不允许用户输入纯HTML。并且SO已经做了类似的事情,尝试创建一个javascript链接,它将被删除

<?php
//Javascript link filter test
if(isset($_POST['jsfilter'])){
    $html = "<a href=\"". $_POST['jsfilter']."\"> JS Link </a>";
    $pattern = "/ href\\s*?=\\s*?[\"']\\s*?(javascript)\\s*?(:).*?([\"']) /is";
    $replacement = "\"javascript: alert('Javascript links have been blocked');\"";
    $html = preg_replace($pattern, $replacement, $html);
    echo $html;
}
?>
<form method="post">
<input type="text" name="jsfilter" />
<button type="submit">Submit</button>
</form>

4 个答案:

答案 0 :(得分:3)

正确的正则表达式应该是:

$pattern = '/href="javascript:[^"]+"/';
$replacement = 'href="javascript:alert(\'Javascript links have been blocked\')"';

答案 1 :(得分:1)

使用strip_tags和htmlSpecialChars()显示用户生成的内容。如果您想让用户使用特定标签,请参阅BBcode。

答案 2 :(得分:0)

试试这段代码。我想,这会有所帮助。

<?php
//Javascript link filter test
if(isset($_POST['jsfilter'])){
    $html = "<a href=\"". $_POST['jsfilter']."\"> JS Link </a>";
    $pattern = '/a href="javascript:(.*?)"/i';
    $replacement = 'a href="javascript: alert(\'Javascript links have been blocked\');"';
    $html = preg_replace($pattern, $replacement, $html);
    echo $html;
}
?>

答案 3 :(得分:0)

你应该测试引号和双引号,处理空格等......

    $html = preg_replace( '/href\s*=\s*"javascript:[^"]+"/i' , 'href="#"' , $html );
    $html = preg_replace( '/href\s*=\s*\'javascript:[^i]+\'/i' , 'href=\'#\'' , $html );