简体   繁体   English

使用 domelement 中的所有子节点更改节点值

[英]change nodevalue with all childnodes in domelement

I have html code something like this:我有 html 代码是这样的:

<p><i>i_text</i>,p_text</p>

i_text ,p_text i_text ,p_text

i want change all node values in this domelement and keep all tags我想更改此 domelement 中的所有节点值并保留所有标签

i_changed_text ,p_changed_text i_changed_text ,p_changed_text

my attempts)我的尝试)

$html = '<p><i>i_text</i> p_text</p>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = true;
$elements = $dom->getElementsByTagName('*');
foreach ($elements as $element) {
        $element->nodeValue = str_replace('_','_changed_',$element->nodeValue);
}
echo($dom->saveHTML());

output output

i_changed_text,p_changed_text i_changed_text,p_changed_text

this code return correct text but don't save childnodes 此代码返回正确的文本但不保存子节点

$html = '<p><i>i_text</i>,p_text</p>'; $dom = new DOMDocument(); $dom->loadXML($html); $dom->preserveWhiteSpace = false; $dom->validateOnParse = true; $elements = $dom->getElementsByTagName('*'); $elem = $dom->createElement('dfn', 'tag'); $attr = $dom->createAttribute('text'); $attr->value = 'element'; $elem->appendChild($attr); $elements = $dom->getElementsByTagName('*'); foreach ($elements as $element) { while ($element->hasChildnodes()) { $element = $element->childNodes->item(0); } $changed_value = str_replace('_','_changed_',$element->nodeValue); $element->nodeValue = str_replace("tag", $dom->saveXML($elem), $changed_value); } echo ($dom->saveXML());

output output

i_changed_text ,p_text i_changed_text ,p_text

this code save and change values in childnodes but don't change text in parentnode 此代码保存并更改子节点中的值,但不更改父节点中的文本

my solution)我的解决方案)

i_text ,p_text ,a_text ,another one_text i_text , p_text ,a_text ,另一个 one_text

$html = '<p><i>i_text</i>,p_text<b>,a_text</b>,another one_text</p>';
$dom = new DOMDocument();
$dom->loadXML($html);
$dom->preserveWhiteSpace = false;
$dom->validateOnParse = true;
$elements = $dom->getElementsByTagName('*');

foreach ($elements as $element) {
    if($element->hasChildnodes()==true && $element->parentNode->nodeName == '#document'){
        foreach($element->childNodes as $element_child){
            $element_child->nodeValue = str_replace('_','_changed_', $element_child->nodeValue);
        }
    }
}
echo ($dom->saveXML());

output output

i_changed_text ,p_changed_text ,a_changed_text ,another one_changed_text i_changed_text ,p_changed_text , a_changed_text ,另一个_changed_text

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM