2012-01-03 145 views
1

我试图找到一个正则表达式来删除所有html特殊字符(主要是&,<,>),但保持html标记完好无损。正则表达式:保留HTML标记,只删除html特殊字符

我从数据库中得到这些信息,所以我不能确定像<和>这样的字符被替换为& gt;和& lt;

我可以设法取代&与PHP中的正则表达式如下它<:

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

我现在唯一的麻烦修复>标签,因为我不得不使用查找隐藏,这不允许非固定长度的RegEx。

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

任何想法?

问候 - 托马斯

+3

哦,不,请不要再次 – zerkms 2012-01-03 10:43:20

+2

http://php.net/manual/en/function.htmlspecialchars.php应该帮助你。 – lfxgroove 2012-01-03 10:43:33

+0

htmlspecialchars也会替换标签。 – 2012-01-03 10:44:52

回答

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

DOM解析器不需要有效的html吗?我通常只会得到如下文字:“这是我的花哨 text我爱我的文字lalalal>哇我很棒” – 2012-01-03 10:46:52

+3

DOMDocument :: loadHTML可以加载部分HTML。这将添加任何所需的HTML框架(html,head,body),并且您需要一些编码体操来获取PHP <5.3.6的DOMDocument的部分内容,但除此之外它可以可靠地工作。有几十个关于这个问题的问题要求提供这方面的个人方面,所以当你遇到问题时请给它一个搜索。 – Gordon 2012-01-03 10:48:45

相关问题