通过选择标签名称在 PHP 中创建属性

Create attribute in PHP by selecting tag name

我正在尝试加载 html,找到一个标签并为其添加一个属性,然后再显示它。

我试过:

libxml_use_internal_errors(true);

$domDocument->loadHTML("<html><body>Test<br></body></html>");
$domElement = $domDocument->getElementsByTagName('body');

foreach ($domElement as $formula) {
    $formula->nodeValue->createAttribute('name')->value = 'attributevalue';
}

libxml_use_internal_errors(false);

但是我有这个错误:

Call to a member function createAttribute() on string

请问有解决办法吗?

此致

nodeValue returns String 类型,这不是创建属性的方式。

而事实上,节点的类型是DOMElement,所以你需要像下面的代码一样设置属性:

<?php
$domDocument = new DOMDocument();
$domDocument->loadHTML("<html><body>Test<br></body></html>");
$domElement = $domDocument->getElementsByTagName('body');
foreach ($domElement as $formula) {
    $formula->setAttribute("name", "attributevalue");
}
?>

像这样尝试

libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br></body></html>");
$domElements = $doc->getElementsByTagName('body');
foreach ($domElements as $domElement) {
    $domAttribute = $doc->createAttribute('name');
    $domAttribute->value = 'attributevalue';
    $domElement->appendChild($domAttribute);
    print_r($domElement->getAttribute('name'));
    // returns attributevalue
}
libxml_use_internal_errors(false);

试试看@PHP-Sandbox

这是一个可能的解决方案,其中使用 setAttribute 而不是创建。虽然我不确定循环的目的,因为通常只有 1 个 body 标签。

libxml_use_internal_errors(true);

$domDocument->loadHTML("<html><body>Test<br></body></html>");
$domElement = $domDocument->getElementsByTagName('body');

foreach ($domElement as $formula) {
    $formula->setAttribute('name', 'thevalue');
}

libxml_use_internal_errors(false);