[英]Php: remove all tags, but “a href” in a text
這是我的問題:
我有一個文本區域,用戶可以在其中輸入他想要的任何內容。
當他發送此文本(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 )將是“可點擊的”。
例如,您可以在此處查看現在的顯示方式。 看到公告的最后一行嗎? 我希望網站的鏈接是“可點擊的”。
你會怎么做?
只需在htmlentities()函數之后添加preg_replace()函數即可還原轉義的標簽
$output = textForWeb($output);
$output = preg_replace('#<a href="(?=https:\/\/|http:\/\/)(.*?)">(.*?)</a>#i', '<a href="$1">$2</a>', $output);
echo $output;
這樣,您仍然可以以安全的方式轉義所有其他HTML(而不是使用strip_tags()函數。)
此preg_replace()函數搜索鏈接到以http://或https://開頭的頁面的標簽,然后用<,>和“替換轉義的特殊字符,使鏈接再次可單擊。
確定輸出時,最好只使用strip_tags並將“ a”設置為允許的元素?
即
$string = strip_tags($string,'<a>');
但這會刪除標簽,而不是將其轉換為它們的實體。 這取決於您是否需要將除<a>
標記之外的所有內容都轉換為實體,還是僅想刪除代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.