5

我想创建一组<style>标签并将其添加到 HTML 文档的头部标签。

我知道我可以这样开始:

$url_contents = file_get_contents('http://example.com');
$dom = new DOMDocument;
$dom->loadHTML($url_contents);

$new_elm = $dom->createElement('style', 'css goes here');
$elm_type_attr = $dom->createAttribute('type');
$elm_type_attr->value = 'text/css';
$new_elm->appendChild($elm_type_attr);

现在,我也知道我可以像这样将新的样式标签添加到 HTML 中:

$dom->appendChild($ss_elm);
$dom->saveHTML();

但是,这将创建以下场景:

<html>
<!--Lots of HTML here-->
</html><style type="text/css">css goes here</style>

以上基本上是没有意义的;CSS 没有被解析,只是坐在那里。

我在网上找到了这个解决方案(显然没有用):

$head = $dom->getElementsByTagName('head');
$head->appendChild($new_elm);
$dom->saveHTML();

谢谢您的帮助!!

编辑:

是否可以?

4

3 回答 3

6

getElementsByTagName返回一个节点数组,所以可能会尝试

 $head->[0]->appendChild($new_elm);
于 2012-09-11T22:24:25.623 回答
5
$head = $dom->getElementsByTagName('head');

返回一个 DOMNodeList。我认为像这样获得第一个元素会更好

 $head = $dom->getElementsByTagName('head')->item(0);

所以 $head 将是一个 DOMNode 对象。所以你可以使用 appendChild 方法。

于 2012-09-11T22:24:25.047 回答
2

这是对我有用的解决方案

// Create new <style> tag containing given CSS
$new_elm = $dom->createElement('style', 'css goes here');
$new_elm->setAttribute('type', 'text/css');

// Inject the new <style> Tag in the document head
$head = $dom->getElementsByTagName('head')->item(0);
$head->appendChild($new_elm);

您还可以在末尾添加此行以获得干净的缩进

// Add a line break between </style> and </head> (optional)
$head->insertBefore($dom->createTextNode("\n"));
于 2020-10-20T15:07:15.047 回答