2012-01-03 143 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

相關問題