首页 文章

RegEx:保留HTML标记,仅删除html特殊字符

提问于
浏览
1

我正在尝试找到一个正则表达式来删除所有html特殊字符(主要是&,<,>),但保持html标签完好无损 .

我从数据库中获取这些信息,因此我无法确保将<和>之类的字符替换为&gt;和&lt;

我可以设法用PHP中的以下RegEx替换&和<它:

$Value = preg_replace('/<(?!#?\/?[a-zA-Z0-9]+>)/','',$Value);
$Value = preg_replace('/&(?!#?[a-zA-Z0-9]+;)/','&amp;',$Value);

我现在只有修复>标签的麻烦,因为我必须使用lookup-behind,它不允许非固定长度的RegEx .

$Value = preg_replace('/(?<!<[a-zA-Z0-9]+)>/','',$Value);

有任何想法吗?

问候 - 托马斯

2 回答

  • 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 &gt; 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的工作原理 .

  • 0

    我认为http://htmlpurifier.org/可以做你需要的 .

    在这里查看演示:http://htmlpurifier.org/demo.php以测试它具有的选项 .

相关问题