2013-10-23 54 views
1

...或如何以另一種方式做到這一點?如何停止自動轉義字符引用的PHP DOM?

我使用DOMDocument創建了一個選擇框。

$field = $this->dom->createElement('select'); 
$optgroup = $this->dom->createElement('optgroup'); 

foreach($options as $v) { 
    $option = $this->dom->createElement('option'); 
    $option->setAttribute('value', $v); 
    $option->appendChild($this->dom->createTextNode($v)); 

    $optgroup->appendChild($option); 
} 

$field->appendChild($optgroup); 

哪裏$options是從圖標字體字符引用數組預裝:

array('!', '"', '#', '$', ...); 

我需要我的輸出看起來像這樣:

<select> 
    <optgroup> 
    <option value="&#33;">&#33;</option> 
    <option value="&#34;">&#34;</option> 
    <option value="&#35;">&#35;</option> 
    ... 
    </optgroup> 
</select> 

但是,使用DOM方法,它會自動轉義所有字符引用:

<option value="&amp;#33;">&amp;#33;</option> 

我該如何防止發生?

注意:createEntityReference不適用於此,因爲該方法只支持實體引用而不支持字符引用。使用它導致'無效字符錯誤'的致命錯誤。

回答

0

嘗試DocumentFragment的,而是和東西在一些預製的HTML:

$frag = $dom->createDocumentFragment(); 
$frag->loadHTML('<option value="&#33;">&#33;</option>'); 

$dom->appendChild($frag); 

DOM是非常方便的操縱現有的樹,但它是一個令人難以置信的痛苦建立使用只是DOM操作的新樹。有時候用簡單的字符串操作構建html/xml會比較容易,然後在一次操作中將整個字符串推送到DOM中。

+0

'createDocumentFragement'沒有'loadHTML'方法。 http://www.php.net/manual/en/class.domdocumentfragment.php –

+1

拍攝...總是一個捕獲。它的確擴展了domnode,domnode作爲一個屬性。可能會涉及到這一點。它也有附加的XML(),這可能會訣竅。不知道它會與角色實體有多嚴格。 –

+0

這已經有一段時間了,但我從來沒有回過頭來說這最終奏效,只是使用'appendXML()'方法。 –