0

有没有办法做到这一点?我想用另一个元素替换一个元素,但不知何故,这在 PHP 中是不可能的。得到以下代码($content 在我的真实代码中是有效的 html5,但去掉了一些东西以使代码更短。):

$content='<!DOCTYPE html>
<content></content>
</html>';

$with='<img class="fullsize" src="/slide-01.jpg" />';
function replaceCustom($content,$with) {
  @$document = DOMDocument::loadHTML($content);
  $source = $document->getElementsByTagName("content")->item(0);
  if(!$source){
    return $content;
  }
  $fragment = $document->createDocumentFragment();
  $document->validate();
  $fragment->appendXML($with);
  $source->parentNode->replaceChild($fragment, $source);

  $document->formatOutput = TRUE;


  $content = $document->saveHTML();
  return $content;
}
echo replaceCustom($content,$with);

如果我替换为<img class="fullsize" src="/slide-01.jpg" /><img class="fullsize" src="/slide-01.jpg">则内容标记将替换为空字符串。即使没有结束标记的 img 是完全有效的 html,它也不会工作,因为 PHP 似乎只支持 xml。我见过的所有示例代码都使用 appendXML 从字符串创建 documentFragment,但没有等效的 HTML。

有没有办法做到这一点,所以它不会因有效的 HTML 而无效的 XML 而失败?

4

1 回答 1

2

DOMDocumentFragment::appendXMLindead 在我的版本中需要XML(5.4.20,libxml2 版本 2.8.0)。您主要有两个选择:

  1. 为函数提供有效的 XML(所以像<img />.
  2. 按照手册的建议,“走很长的路”:

如果您想遵守标准,则必须创建一个带有虚拟根的临时 DOMDocument,然后循环遍历 XML 数据根的子节点以附加它们。

$tempDoc = new DOMDocument();
$tempDoc->loadHTML('<html><body>'.$with.'</body></html>');
$body = $tempDoc->getElementsByTagName('body')->item(0);
foreach($body->childNodes as $node){
   $newNode = $document->importNode($node, true);
   $source->parentNode->insertBefore($newNode,$source);
}
$source->parentNode->removeChild($source);
于 2013-10-15T13:25:42.697 回答