如何从自动转义字符引用中阻止PHP DOM?

时间:2013-10-23 15:01:11

标签: php dom character-encoding

......或者如何以另一种方式做到这一点?

我正在使用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不起作用,因为该方法仅支持实体引用而不支持字符引用。使用它会导致“无效字符错误”致命错误。

1 个答案:

答案 0 :(得分:0)

尝试使用documentFragment,然后填写一些预先制作的HTML:

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

$dom->appendChild($frag);

DOM可以方便地操作现有树,但使用DOM操作构建新树是一个令人难以置信的PAIN。有时候使用普通的字符串操作构建你的html / xml会更容易,然后在一次操作中将整个字符串推送到DOM中。