DOMDocument 用片段替换 nodeValue 文本
DOMDocument replace nodeValue text with fragment
我想用 HTML 元素片段替换 DOMNode 中的文本。
例如,给定这个 HTML 字符串:
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
我想用 HTML 元素替换“dolor sit amet”。
结果如下:
<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 元素(<em>
等...),而不是正确的 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>
希望对未来的读者有所帮助。
我想用 HTML 元素片段替换 DOMNode 中的文本。
例如,给定这个 HTML 字符串:
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
我想用 HTML 元素替换“dolor sit amet”。
结果如下:
<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 元素(<em>
等...),而不是正确的 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>
希望对未来的读者有所帮助。