2011-04-13 32 views
2

在了這一個方法現在太久抓我的頭屬性的屬性...問題使用れ>與具有多個詞語的價值

$dom = new DOMDocument(); 
$dom->loadHTML($content); 

$links = $dom->getElementsByTagName('a')->item(0); 
foreach ($links->attributes as $attribute) { 
    $name = $attribute->nodeName; 
    $value = str_replace('"', '', stripslashes($attribute->nodeValue)); 
    echo "$name: $value<br />"; 
} 

還有就是我的代碼,我終於得到了來自:php dom get all attributes of a node。我還嘗試了其他方法,例如爲單個屬性調用getAttribute()以查看這是否可行,但得到了相同的結果。

我試圖去通過HTML很簡單:

<a id="testid" title="testtitle" name="this is a testname" href="http://example.com/">link!</a> 

,我發現了以下錯誤:

Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: error parsing attribute name in Entity, line: 1 

我的腳本輸出:

id: testid 
title: testtitle 
name: this 
is: 
a: 
testname: 
href: http://example.com/ 

我應該補充說,如果'name'屬性是一個單詞,那麼輸出工作正常。

所以顯然,它必須使用explode()或空間上的一些愚蠢的東西。有沒有辦法解決這個問題,而沒有將所有空間轉換爲%20或其他內容(我有很多其他內容,除了鏈接,並不想轉換整個內容塊)?

+0

適合我。你使用什麼PHP版本? – 2011-04-13 07:10:34

+0

[DOM不會做類似的事情](http://codepad.viper-7.com/YqiUVN「在Viper鍵盤上運行代碼」)。請提供重現問題的代碼片段。 – Gordon 2011-04-13 07:13:25

+0

使用PHP 5.3.2。我認爲問題是WordPress,因爲我實際上是在插件中做這個。我嘗試使用郵件內容作爲字符串,然後WP提供的值,它與我自己的字符串一起工作,但WP內容不會傳遞。必須是這方面的事情。我可能只是切換到自定義簡碼。更容易。 – 2011-04-13 07:31:51

回答

4

如註釋中所述,name屬性與id屬性共享相同的空間,該屬性被定義爲"NAME token",它們僅限於字母,數字,短劃線,下劃線,句點和冒號。

您會注意到該列表中不允許有空格。

PHP使用的DOMDocument解析器的某些版本對HTML合規性超級嚴格,並且會在發生規範違規時發生並經常發出錯誤錯誤。這可能是其中的一種情況。從名稱屬性中刪除空格,看看是否繼續看到問題。

+0

應該指出的是,W3C自己的驗證器不會在名稱屬性中抱怨空格,並且鏈接的規範沒有明確地說「文字」是否包含空格,但是CDATA是「文檔字符集」中的一系列字符, 。 – Gordon 2011-04-13 09:47:45