繁体   English   中英

DOMDocument用片段替换nodeValue文本

[英]DOMDocument replace nodeValue text with fragment

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

例如,给定以下HTML字符串:

<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>

我想替换“ dolor sit amet ”,并用HTML元素包装。

结果如下:

<p>Lorem ipsum <em>dolor sit amet</em>, consectetuer adipiscing elit.</p>

我可以将新片段添加到元素中,如下所示:

$doc = new DOMDocument();
$paragraph = $doc->appendChild($doc->createElement('p', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'));
$fragment = $doc->createDocumentFragment();
$fragment->appendXML('<em>dolor sit amet</em>');
$paragraph->appendChild($fragment);

但是,这在段落中添加了一个新元素。 我似乎无法用另一个HTML元素替换段落中的文本,只能将元素追加到末尾。

我也尝试过这种方法:

$paragraph->nodeValue = str_replace($searchtext, $doc->saveXML($fragment), $paragraph->nodeValue);

然而,在输出上导致段落值中的转义HTML元素( &lt;em&gt;等),而不是适当的HTML元素。

有什么想法如何用HTML元素替换文本内容或节点值?

感激不尽!

无需创建单独的元素,可以使用preg_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 = "<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;

好的,经过进一步测试,我实际上找到了一种解决方案,该解决方案用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);

结果:

<p>Lorem ipsum <em>dolor sit amet</em>, consectetuer adipiscing elit.</p>

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

暂无
暂无

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

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