Внедрить <customTag>в текст с помощью DOMDocument - PullRequest
0 голосов
/ 24 июня 2019

Я хотел бы добавить пользовательский тег в определенной части текстового узла, используя DOMDocument, моя проблема в том, что я не могу понять, как я могу найти эту конкретную часть, например:

" Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit, Sed do EiusMod Tempor Incididunt U Labore et Dolore Magna Aliqua. "

Моя цель - добавить тег куда-нибудь таким образом:

" Lorem ipsum dolor sit amet, consiptetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "

Проблема в том, что каждый текстовый узел является экземпляром DOMNode, поэтому я не могу правильно получить текстовое содержимое узла и "вставить" тег прямо в него. Какие-либо предложения? Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Это немного сложный путь решения, но он в основном начинается с 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();
0 голосов
/ 24 июня 2019

Хочешь что-нибудь подобное?Немного логики и регулярных выражений, и все готово.Объясняется в комментариях.

<?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

Это также означает, что ваш первый аргумент должен идти первым слева направо, а затем второй аргумент.

...