这是我的问题:
我有一个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。看到宣布的最后一行?我希望该网站的链接是“可点击的”。
你会怎么做?
答案 0 :(得分:2)
在你的htmlentities()函数之后添加一个preg_replace()函数来恢复转义的 a 标记
$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://开头的网页的 a 标记,然后使用&lt;,&gt;替换转义的特殊字符和“,使链接再次可点击。
答案 1 :(得分:1)
当输出肯定你最好只使用strip_tags并将“a”设置为允许元素?
即
$string = strip_tags($string,'<a>');
这会删除标签,而不是将它们转换为实体。这取决于您是否需要它将<a>
标签之外的所有内容转换为实体,或者如果您只想删除代码。