PHP的:删除所有的标签,但“A HREF”文本

问题描述:

这里是我的问题: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

只需添加一个的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

当输出肯定你会更好只是使用strip_tags和设置“a”是一个允许的元素?

I.e.

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

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

+1

strip_tags()isn对于转义HTML等是不够的,你应该尽可能使用htmlentities($ string,ENT_QUOTES,$ text_encoding),或者使用htmlPurifier或类似的东西 – Tom 2012-01-18 11:36:39