使用htmlspecialchars但允许<a href="URL">...</a>

时间:2013-06-19 04:55:59

标签: php

使用htmlspecialchars但允许<a href="URL">...</a> 额外的空格也应该有效,例如< a href =


$pureHTML = htmlspecialchars($dirtyHTML,ENT_QUOTES);

现在我可能需要preg_replace $pureHTML,但preg_replace应该是什么?或者,您是否建议使用HTML Purifier

我想仅为href属性允许锚标记对。单击Onclick,不允许使用目标属性。

2 个答案:

答案 0 :(得分:2)

我不确定您是否可以在一次替换中获得此内容,因为您必须匹配并替换“&lt; a”和“&gt;”围绕href,同时保持完整。结束“&lt; a&gt;”是一个容易取代的想法。可能有一种方法可以在一个preg_replace中完成所有这些,但我在正则表达式方面不够精通这样做..无论如何我会这样做

$pureHTML = htmlspecialchars($dirtyHTML, ENT_NOQUOTES);
preg_match_all('/(&lt;\s*a)\s*(\w+="[\w:\/@#%_\-&\.]+")\s*(&gt;)/i', $pureHTML, $matches, PREG_SET_ORDER);
foreach($matches as $match) {
    $pureHTML = str_replace($match[0], "<a " . $match[2] . ">", $pureHTML);
}
$pureHTML = preg_replace('/(&lt;\/\s*a\s*&gt;)/i', '</a>', $pureHTML);

基本上,它匹配(<a)(href="url")(>)的转义形式,允许每个部分之间的空格(也是“&lt;”和“a”之间的空格)。然后它将原始匹配替换为文字<a(href="url")>

然后只是直接替换转义形式(允许空格)

答案 1 :(得分:1)

我认为您需要strip-tags()功能。

$pureHTML =  strip_tags($html, '<a>');