Php DOMDocument用片段替换节点值文本

Php DOMDocument用片段替换节点值文本,php,html,domdocument,Php,Html,Domdocument,我想用HTML元素片段替换DOMNode中的文本 例如,给定此HTML字符串: <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p> 但是,当输出结果导致段落值中出现转义HTML元素(emetc…)而不是正确的HTML元素时 如何用HTML元素替换文本内容或节点值 谢谢 不需要创建单独的元素,您可以使用preg\u replace函数搜索特定的模式并用字符串替换它,如下所示: $str = "&

我想用HTML元素片段替换DOMNode中的文本

例如,给定此HTML字符串:

<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
但是,当输出结果导致段落值中出现转义HTML元素(
em
etc…)而不是正确的HTML元素时

如何用HTML元素替换文本内容或节点值


谢谢

不需要创建单独的元素,您可以使用
preg\u replace
函数搜索特定的模式并用字符串替换它,如下所示:

$str = "<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>";

$doc = new DomDocument();
$doc->loadHTML($str);
$paragraph = $doc->getElementsByTagName('p')->item(0);
$modified_string = preg_replace('/dolor sit amet/', '<em>dolor sit amet</em>', $paragraph->textContent);
echo $modified_string;
$str=“Lorem ipsum door sit amet,Concertetuer adipising elite.

”; $doc=新的DomDocument(); $doc->loadHTML($str); $paragration=$doc->getElementsByTagName('p')->item(0); $modified_string=preg_replace(“/dolor-sit-amet/”,“dolor-sit-amet”,$paragration->textContent); echo$modified_字符串;
输出:

以下是参考资料:

编辑:

$str = "<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>";

$doc = new DomDocument();
$doc->loadHTML($str);
$paragraph = $doc->getElementsByTagName('p')->item(0);
$paragraph->nodeValue = preg_replace('/dolor sit amet/', '<em>dolor sit amet</em>', $paragraph->textContent);
$str = htmlspecialchars_decode($doc->saveHtml());
echo $str;
$str=“Lorem ipsum door sit amet,Concertetuer adipising elite.

”; $doc=新的DomDocument(); $doc->loadHTML($str); $paragration=$doc->getElementsByTagName('p')->item(0); $PARATION->nodeValue=preg_replace(“/dolor sit amet/”、“dolor sit amet”、$PARATION->textContent); $str=htmlspecialchars\u decode($doc->saveHtml()); echo$str;
好的,在进一步测试之后,我实际上找到了一个解决方案,在DOMDocument中用一个新的有效HTML元素替换文本内容

示例代码如下:

$doc = new DOMDocument();
// Create sample paragraph element
$paragraph = $doc->appendChild($doc->createElement('p', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'));
// Create example replacement insert element
$element = $doc->createElement('em', 'dolor sit amet');
// Create element fragment to insert
$fragment = $doc->createDocumentFragment();
// Get new paragraph value
$new_value = str_replace('dolor sit amet', $doc->saveXML($element), $paragraph->nodeValue);
// Add new paragraph value as fragment
$fragment->appendXML('<p>' . $new_value . '</p>');
// Replace paragraph element with new valid fragment
$paragraph->parentNode->replaceChild($fragment, $paragraph);
$doc=newDOMDocument();
//创建示例段落元素
$paragration=$doc->appendChild($doc->createElement('p','Lorem ipsum door sit amet,concertetuer adipising elit');
//创建替换插入元素的示例
$element=$doc->createElement('em','dolor sit amet');
//创建要插入的元素片段
$fragment=$doc->createDocumentFragment();
//获取新段落值
$new_value=str_replace('dolor sit amet',$doc->saveXML($element),$paragration->nodeValue);
//将新段落值添加为片段
$fragment->appendXML(“”.$new_value.“

”); //用新的有效片段替换段落元素 $paragration->parentNode->replaceChild($fragment,$paragration);
结果:

<p>Lorem ipsum <em>dolor sit amet</em>, consectetuer adipiscing elit.</p>
Lorem ipsum door sit amet,继续成为精英


希望这对未来的读者有所帮助。

谢谢您的回复。是的,我尝试了类似于
stru replace
的方法,并设置了
$paragration->nodeValue
,但我发现新元素值在DOMDocument中没有被视为正确的元素,而是作为转义HTML添加的。这意味着XPath等无法查询它。。在文件中(这是另一项要求)。我需要将其添加为一个适当的HTML元素,替换目标文本以创建一个有效的DOMDocument。再次感谢,是的,这实际上是我正在使用的当前解决方案,但在输出上使用
HTML\u entity\u decode
。但是,它仍然存在一个问题,即该元素没有作为适当的HTML元素添加到DOMDocument对象中。这意味着我不能在文档中使用xpath查询元素,这是替换多个嵌套子元素所必需的。尽管如此,Upvote仍然是一个合理的答案,但我仍在寻找一个用有效HTML元素替换文本的解决方案。经过进一步测试,我找到了我在下面发布的解决方案。再次感谢您的建议,并祝您2016年万事如意:)@DavidThomas别忘了将您的答案标记为已接受,以便对so的未来访客有用。新年快乐!:)
$str = "<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>";

$doc = new DomDocument();
$doc->loadHTML($str);
$paragraph = $doc->getElementsByTagName('p')->item(0);
$paragraph->nodeValue = preg_replace('/dolor sit amet/', '<em>dolor sit amet</em>', $paragraph->textContent);
$str = htmlspecialchars_decode($doc->saveHtml());
echo $str;
$doc = new DOMDocument();
// Create sample paragraph element
$paragraph = $doc->appendChild($doc->createElement('p', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'));
// Create example replacement insert element
$element = $doc->createElement('em', 'dolor sit amet');
// Create element fragment to insert
$fragment = $doc->createDocumentFragment();
// Get new paragraph value
$new_value = str_replace('dolor sit amet', $doc->saveXML($element), $paragraph->nodeValue);
// Add new paragraph value as fragment
$fragment->appendXML('<p>' . $new_value . '</p>');
// Replace paragraph element with new valid fragment
$paragraph->parentNode->replaceChild($fragment, $paragraph);
<p>Lorem ipsum <em>dolor sit amet</em>, consectetuer adipiscing elit.</p>