这是我的问题:
我有一个文本区域,用户可以在其中输入他想要的任何内容。
当他发送此文本(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('#<a href="(?=https:'/'/|http:'/'/)(.*?)">(.*?)</a>#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>
标记之外的所有内容转换为实体,还是只想删除代码。