我想使用DOMDocument在文本节点的某个部分中添加自定义标签,我的问题是我无法弄清楚如何定位该特定部分,例如:
“ Lorem ipsum dolor坐下来,奉献己任,sius do eiusmod tempor indicidunt ut Labore et dolore magna aliqua。”
我的目的是以这种方式将标签添加到某处:
“ 腹腔积液,
consectetur adipiscing elit,sius做临时劳动者和劳动大臣。”
问题在于,每个文本节点都是DOMNode的一个实例,因此我无法正确获取该节点的文本内容并直接“插入”标签。 有什么建议么?谢谢。
答案 0 :(得分:0)
您想要这样的东西吗?一些逻辑和正则表达式就可以了。在评论中解释。
<?php
// example code
$string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.';
$post = from("consectetur", "ut", $string, "<a>");
function from($from,$to, $string, $tag) {
$frompost = strpos($string, $from); // get the pos of first string
$topost = strpos($string, $to); // get the post of second string
$substrfirst = substr($string, 0 , $frompost) . $tag; // trim string for the first word and add concatinate the tag
$substrsecond = $substrfirst . substr($string, $frompost , strlen($from)); // trim another string starting from the first word and ending the length of the word and combine it with previous result
$strinbetweenregex = '/(?<='.$from.')(.*)(?='.$to.')/'; // regex to get string in between
preg_match($strinbetweenregex, $string, $matches); // get regex result
$restString = substr($string, $topost + strlen($to) , strlen($string)); // get the rest of the string by starting from last str postition + the length of the last str to the length of the str
return $substrsecond. $matches[0] . $to .$tag . $restString; // return all the string.
}
这将给Lorem ipsum dolor sit amet, <a>consectetur adipiscing elit, sed do eiusmod tempor incididunt ut</a> labore et dolore magna aliqua.
这也给我们带来了不平等。是
$frompost < $topost
这也意味着您的第一个参数应该从左至右排在第一位,然后是第二个参数。
答案 1 :(得分:0)
这对于解决方案来说有点漫长的路要走,但它基本上是从DOMNode(或DOMElement)开始的,最终将内容与更改一样放回原处。它还试图确保在其周围保留任何内容(包括标记和其他结构)。
该想法是保存要更新的节点的HTML,然后仅使用str_replace()
来更改内容。然后将其导入回文档中(我认为使用SimpleXML更为简单,然后将新节点导入DOMDOcument,然后用新节点替换原始节点...
$source = '<div class="ToReplace">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div>';
$textToTag="consectetur adipiscing";
$tag = "emphasis";
$doc = new DOMDocument();
$doc->loadHTML($source);
foreach ( $doc->getElementsByTagName("div") as $div ) {
$nodeHTML = $doc->saveHTML($div);
$newHTML = str_replace($textToTag, "<$tag>$textToTag</$tag>", $nodeHTML);
$newNode = simplexml_load_string($newHTML);
$import = $doc->importNode(dom_import_simplexml($newNode), true);
$div->parentNode->replaceChild($import, $div);
}
echo $doc->saveHTML();