2013-06-20 214 views
2

我正在尋找一個正則表達式,將能夠替換所有鏈接,如<a href="javascript://potentiallybadstuff"> Link </a>帶有警告。我一直在玩,但迄今沒有成功!正則表達式我一直都很糟糕,有人能指出我正確的方向嗎?我有這個到目前爲止:刪除javascript鏈接

編輯:人們說不要使用正則表達式 - HTML將是一個降價解析器的輸出,剝離標記中的所有HTML標記。因此,我知道所有鏈接的輸出將如上所述進行格式化,因此在這種特定情況下,正則表達式肯定會是一個好工具。我不允許用戶輸入純粹的HTML。所以做了非常類似的東西,嘗試創建一個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> 
+2

不要。不要。它看起來像你正在接受HTML標籤。接受BBCode代替。標籤不是唯一需要擔心的事情。還有'img'標籤,'form'標籤,'script'標籤以及其他所有具有'onload'屬性等的內容。 – h2ooooooo

+0

@ h2ooooooo嗯,我接受減價的HTML標籤剝離。我想鏈接可用,但只是不是JavaScript的?我不允許任何圖片或表格或腳本;只是鏈接 –

回答

3

正確的正則表達式應該是:

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

謝謝你回答這個問題,而不是批評:) –

1

使用用strip_tags並用htmlspecialchars()來顯示用戶生成的內容。如果您想讓用戶使用特定標籤,請參閱BBcode。

+0

剛剛測試過BBCode,並沒有阻止JavaScript鏈接 –

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; 
} 
?> 
+0

你確定嗎?我最近在腳本中做了這樣的正則表達式,並且它從href字符串中選擇了一切。你應該使用'[^「] *'而不是'(。*?)',因爲你的服務器會認爲第二個引號仍然在href中。 – Soaku

0

您應該測試報價和雙引號,處理空格等..

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