2012-01-18 94 views
0

這裏是我的問題:PHP的:刪除所有的標籤,但「A HREF」文本

我有一個文本,用戶可以輸入任何他想要的。

當他把這個文本(POST方法),在服務器端,我不過濾它在所有寫入到數據庫之前(因爲我想保持「完整」,用戶輸入的內容(也許它可以用作他試圖破解的證據或任何))。

然後輸出它之前,我用這個函數:

public function textForWeb($texte,$br=true) 
{ 
    if ($br) { 
    return 
     mb_ereg_replace("((\r)?\n)", "<br />", 
     htmlentities(
      stripslashes($texte), 
      ENT_QUOTES, 'UTF-8' 
     ) 
    ); 
    } 
    else { 
    return 
     htmlentities(
     stripslashes($texte), 
     ENT_QUOTES, 'UTF-8' 
    ); 
    } 
} 

所以文本正確過濾,並保持UTF-8編碼。

但問題是,我想所有這些文字:<a href="http://url">xxx</a>被不變。即當我將顯示它時,鏈接(只鏈接「http://」和沒有JavaScript裏面的)將是「可點擊」。

例如,您可以看到它現在如何顯示here。看到通告的最後一行?我希望鏈接到網站是「可點擊」的。

你會怎麼做?

+1

爲什麼不使用strip_tags()?這並不解決JavaScript喜歡,但仍然是一個單一的功能。在strip標籤tou之後,可以刪除所有href屬性。用正則表達式可能。 – Kristian 2012-01-18 11:05:25

+0

是的,但是如果只刪除'href =「(?! http)'那麼它就不是那麼糟糕了,它可能會破壞語法,但是對於那個鏈接來說,olny可能並不會超出這個正則表達式。 – Kristian 2012-01-18 11:11:25

回答

2

只需添加一個的preg_replace()函數您ヶ輛()函數

$output = textForWeb($output); 
$output = preg_replace('#&lt;a href=&quot;(?=https:\/\/|http:\/\/)(.*?)&quot;&gt;(.*?)&lt;/a&gt;#i', '<a href="$1">$2</a>', $output); 

echo $output; 

這樣,你仍然可以逃避在一個安全的方式,所有其它的HTML(而不是使用用strip_tags後恢復逃脫一個標籤()函數)

此的preg_replace()函數搜索一個標籤鏈接到以http網頁://或https://,然後用<,>和替換轉義特殊字符」,使得鏈接再次點擊。

+0

明天我會試試,看看它是否有效,非常感謝=) – 2012-01-18 20:36:28

+0

@OivivPons - 工作? :) – Tom 2012-01-19 13:39:10

+0

我正在處理它。其實我想我會轉換爲HTML實體,然後我會改變自己的網址我認爲「有效」,即例如,如果我看到「'http:// wwW.m.com /'」我將添加'一個href'標籤,以便它可以「點擊」 – 2012-01-19 16:53:43

1

當輸出肯定你會更好只是使用strip_tags和設置「a」是一個允許的元素?

I.e.

$string = strip_tags($string,'<a>'); 

這將刪除標籤,而不是將它們轉換爲它們的實體。這取決於您是否需要將所有內容從<a>轉換爲實體,或者您是否只想刪除代碼。

相關問題