簡體   English   中英

Php:刪除所有標簽,但刪除文本中的“ a href”

[英]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('#&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://開頭的頁面標簽,然后用<,>和“替換轉義的特殊字符,使鏈接再次可單擊。

確定輸出時,最好只使用strip_tags並將“ a”設置為允許的元素?

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

但這會刪除標簽,而不是將其轉換為它們的實體。 這取決於您是否需要將除<a>標記之外的所有內容都轉換為實體,還是僅想刪除代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM