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)将是"可点击的"。

例如,您可以在这里看到它现在是如何显示的。看到公告的最后一行了吗?我希望网站的链接是"可点击的"。

你会怎么做?

只需添加一个preg_replace()函数,即可在htmlenties()函数之后恢复转义的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标记,然后将转义的特殊字符替换为<,>和",使链接再次可点击。

输出时,您最好只使用strip_tag并将"a"设置为允许的元素?

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

这将删除标记,而不是将它们转换为实体。这取决于您是需要它来将<a>标记之外的所有内容转换为实体,还是只想删除代码。