我正在尝试找到一个正则表达式来删除所有html特殊字符(主要是&,<,>)但保持html标记不变。
我从数据库中获取这些信息,因此我无法确保像<&lt;这样的字符。和&gt;被替换为&amp; gt;和&amp; lt;
我可以设法替换&amp;和&lt;它在PHP中使用以下RegEx:
$Value = preg_replace('/<(?!#?\/?[a-zA-Z0-9]+>)/','',$Value);
$Value = preg_replace('/&(?!#?[a-zA-Z0-9]+;)/','&',$Value);
我现在只有麻烦修复&gt;标签,因为我必须使用lookup-behind,它不允许非固定长度的RegEx。
$Value = preg_replace('/(?<!<[a-zA-Z0-9]+)>/','',$Value);
有什么想法吗?
问候 -Thomas
答案 0 :(得分:3)
使用DOM Parser并仅将替换应用于文本节点。
$partialId = uniqid();
$dom = new DOMDocument;
$dom->loadHTML(sprintf('<div id="%s">%s</div>', $partialId, $html));
echo $dom->saveHtml($dom->getElementById($partialId));
解析部分内容已经将XML特殊字符转换为各自的实体:
<div id="4f02efa1a4e9b">this is my fancy <i>text</i> I love my text lalalal > wow I'm great"</div>
如果您不使用PHP 5.3.6,则不能将saveHTML
与节点一起使用。有关解决方法,请参阅How to get innerHTML of DOMNode?和How to return outer html of DOMDocument?。
如果您需要处理文本节点,可以执行
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//text()') as $textNode) {
$textNode->nodeValue = doSomething($textNode->nodeValue);
}
另请参阅DOMDocument in php,了解DOM的工作原理。
答案 1 :(得分:0)
我认为http://htmlpurifier.org/可以做你需要的事。
点击这里的演示:http://htmlpurifier.org/demo.php来测试它的选项。