Php:删除所有标签,但文本中的“a href”

时间:2012-01-18 10:59:05

标签: php filtering

这是我的问题:

我有一个textarea,用户可以输入他想要的任何内容。

当他发送此文本(POST方法)时,在服务器端我不会过滤 at all ,然后再将其写入数据库(因为我想要保持“完整”用户输入的内容(也许它可以用作他试图破解的证据或其他)。

然后,在输出之前,我使用这个函数:

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。看到宣布的最后一行?我希望该网站的链接是“可点击的”。

你会怎么做?

2 个答案:

答案 0 :(得分:2)

在你的htmlentities()函数之后添加一个preg_replace()函数来恢复转义的 a 标记

$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://开头的网页的 a 标记,然后使用&lt;,&gt;替换转义的特殊字符和“,使链接再次可点击。

答案 1 :(得分:1)

当输出肯定你最好只使用strip_tags并将“a”设置为允许元素?

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

这会删除标签,而不是将它们转换为实体。这取决于您是否需要它将<a>标签之外的所有内容转换为实体,或者如果您只想删除代码。