2011-06-19 31 views
1

第一:我讀過將軍;不要在像這樣的XHTML參數上使用RegEx:RegEx match open tags except XHTML self-contained tags,我確實瞭解RegEx在嵌套XHTML或XML節點上的失敗方式。用PHP從XHTML中剝離微數據 - 使用RegEx?

我不明白爲什麼單獨操縱XML的屬性應該使用RegEx來中斷。所以似乎有一些例外。屬性始終包含在以<開頭並以>結尾的單個節點中,其間任何其他<or>都會破壞XML,因此不會發生這種情況。

現在我想清除它可能包含的任何微數據的XHTML字符串。這是itemscope,itemtype,itemprop,itemiditemref的任何屬性。類似這樣的:

... 
<body itemscope="itemscope" itemtype="http://schema.org/WebPage"> 
<div itemprop="maincontent">content</div> 
... 

在PHP中這樣做的最佳方式是什麼?

+0

如果您想清除HTML中的微數據屬性,那麼HTMLPurifier或htmltidy就足夠了。都不知道html5屬性,並會刪除它們。 – mario

回答

4

其實我建議:

  1. 裝入有類似的SimpleXML的字符串。
  2. 刪除您有興趣沖洗的屬性。
  3. 將其保存回字符串。

有一堆命名空間問題,我不知道你要怎麼處理,但這可能比嘗試構建一個或多個正則表達式更清晰/更快樂,並且確保你不會「不會錯過任何事情

編輯:事實證明SimpleXML不會工作(有限的修改功能),但DOM會。事情是這樣的:

$data=<<<END1 
<body itemscope="itemscope" itemtype="http://schema.org/WebPage"> 
<div itemprop="maincontent">content</div> 
</body> 
END1; 

$xml=new DOMDocument(); 
$xml->loadXML($data); 

// find every relevant node 
$xpath = new DOMXPath($xml); 
$attr = $xpath->query("//@itemscope|//@itemprop|//@itemtype"); 
foreach ($attr as $entry) { 
    $entry->parentNode->removeAttribute($entry->nodeName); 
} 
echo $xml->saveXML(); 

你必須修改它包括所有要刪除的屬性,就像我說我不知道​​它將如何處理的命名空間,但它的一個開端。

+0

看起來不錯。還有一件事,由於微數據的原因,可以在身體中存在元標籤。我以爲我可以選擇與xpath'身體/ /元',但不知何故它不工作...... –

+0

上面的查詢工作屬性:我認爲你想要做/ /身體/元,但也意識到,因爲那些不是你不能使用'removeAttribute'的屬性。最簡單的方法是將標記放在單獨的xpath循環中,並使用'removeChild'來代替。我明白的 – Femi

+0

。我確實使它成爲一個單獨的xpath循環,並使用removeChild。這是在手冊上。 '$ xml-> getElementsByTagName(「body」) - > item(0) - > getElementsByTagName(「meta」) - > length;'返回標籤的實際數量,而所有xpath版本甚至嘗試了'$ xpath->查詢(「// body」) - > length'返回'0'。我想知道我的xpath問題是什麼。嘗試使用屬性'$ xpath-> query(「// @ itemscope」) - > length;'雖然...雖然可行...... –