使用DOMDocument在文本内注入<customTag>

时间:2019-06-24 08:48:45

标签: php dom text domdocument

我想使用DOMDocument在文本节点的某个部分中添加自定义标签,我的问题是我无法弄清楚如何定位该特定部分,例如:

  

Lorem ipsum dolor坐下来,奉献己任,sius do eiusmod tempor indicidunt ut Labore et dolore magna aliqua。

我的目的是以这种方式将标签添加到某处:

  

腹腔积液, consectetur adipiscing elit,sius做临时劳动者和劳动大臣。

问题在于,每个文本节点都是DOMNode的一个实例,因此我无法正确获取该节点的文本内容并直接“插入”标签。 有什么建议么?谢谢。

2 个答案:

答案 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();