2013-01-03 19 views
2

我跑在內容的preg_replace,我沒有必要去控制和我遇到的問題與含有像貨幣價值的東西(即$1.00)替換值。無可否認,這是一個在其他問題中已經解決的常見問題。我發現的最接近的解決方案是:的preg_replace「疑難雜症」與重置價值逃避

http://www.procata.com/blog/archives/2005/11/13/two-preg_replace-escaping-gotchas/

我的問題是更加複雜,因爲重置價值是不是我可以逃脫時間提前,至少在某種程度上,我可以看到。這裏是我的預浸代碼:

$body = preg_replace('/<special_tag id="'.$tagID.'">(.*?)<\/special_tag>/','$1',$body); 

正如你可以看到我拍攝了一組自定義標籤內的所有內容,並刪除周圍的開始和結束標記,但保持發現裏面的內容。然而,替換'$1'不適用於需要的轉義,因此碰巧位於替換值中的貨幣值將不正確地終止。

有我在想這更換?有什麼我可以用來刪除我的特殊標籤,記住它必須考慮到該特定標籤的唯一ID?

任何幫助將不勝感激!

+3

「還有別的東西我可以使用刪除我的特殊標籤「:uuuh,[如何處理DOM解析器](http://stackoverflow.com/questions/3577641/best-met部門首長到語法分析HTML/3577662#3577662)? – Gordon

+0

我實際上在同一個腳本的另一部分中使用了這種方法,但是對於這個特殊的替換,它似乎有點矯枉過正,只是儘量保持低成本,但如果這是唯一的選擇,我會回頭看看它。 – oucil

+0

這不是* only *選項,但是在使用正則表達式來處理這個問題之前,我會考慮這個問題。 – Gordon

回答

1

,不應該有任何的「陷阱」的可能DOM的解決方案。

假設這HTML:

$html = <<< HTML 
<html> 
    <body> 
     <special_tag id="foo"> 
      <p>Some content</p> 
      <p>Some more content</p> 
     </special_tag> 
    </body> 
</html> 
HTML; 

你拉起special_tag的孩子,事後刪除special_tag:

// create DOMDocument, suppress parsing errors 
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($html); 
libxml_clear_errors(); 

// get special_tag with id foo 
$xpath = new DOMXPath($dom); 
$foo = $xpath->query('//special_tag[@id="foo"]')->item(0); 

// move all children before special_tag 
while ($foo->childNodes->length > 0) { 
    $foo->parentNode->insertBefore($foo->childNodes->item(0)); 
} 

// remove now empty special_tag 
$foo->parentNode->removeChild($foo); 

// output 
echo $dom->saveHTML($dom->documentElement); 

會導致類似

<html><body> 
    <p>Some content</p> 
     <p>Some more content</p> 
    </body></html> 
+0

感謝您的示例代碼,我相信其他人會讚賞它,我也會說,這可能是一個更明智的向DOM過渡,而不是像我對preg函數一樣依賴。乾杯! – oucil

0

使用正則表達式解析XML /不推薦使用HTML。改爲使用DOM解析器。