xml — DOMDocument — получить предыдущий элемент и его атрибуты данных

Здравствуйте, я пытаюсь управлять DOMDocument из строки.
Моя строка выглядит так:

$String =
<p>
<div class="ST" data-start="1" data-end="5">
<span>WORD1</span><span>WORD2</span>
</div>
</p>
<p>
WORD3 WORD4
</p>
<p>
<div class="ST" data-start="6" data-end="10">
<span>WORD5</span><span>WORD6</span>
</div>
</p>

Моя цель — поставить слова WORD3 а также WORD4 в <div> пометить как WORD1 WORD2 а также WORD5 WORD6 для первого и последнего <p> теги. Кроме того, мне нужно получить data-start data-end предыдущего p > div и получить наконец это:

$String =
<p>
<div class="ST" data-start="1" data-end="5">
<span>WORD1</span><span>WORD2</span>
</div>
</p>
<p>
<div class="ST" data-start="1" data-end="5">
WORD3 WORD4
</div>
</p>
<p>
<div class="ST" data-start="6" data-end="10">
<span>WORD5</span><span>WORD6</span>
</div>
</p>

Мне удалось поставить WORD3 и WORD4 в <div> но я не знаю, как получить предыдущий элемент p > div и получить его атрибуты data-start а также data-end

Мой код:

public function reverseTransform($value) {

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadHTML($value);

$pTags = $dom->getElementsByTagName('p');

$TagFull='';
foreach ($pTags as $pTag) {
$valuePTagFull = $this->DOMinnerHTML($pTag);
if (strpos($valuePTagFull,'<div') === false) {
$valuePTagFull = "<div class='st'>".$valuePTagFull."</div>";
}
$TagFull .= $valuePTagFull;

}
}

private function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child) {
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}

На самом деле, для каждого <p> который имеет WORDx в но без <div> Я заверну WORDx в <div> с data-start а также data-end атрибуты предыдущего <p> >> <div>

Но как выбрать и получить атрибуты из предыдущего элемента с помощью DOM, XML или другим способом?

Спасибо!

0

Решение

Я думаю, вы могли бы получить последние значения start end с регулярным выражением, но это не будет использовать DOM.

if (strpos($valuePTagFull,'<div') === false) {
$valuePTagFull = "<div class='st' data-start=".$matches[1]." data-end=".$matches[2].">".$valuePTagFull."</div>";
}
else{
preg_match('~<div[^>]*?class="ST"[^>]*?data-start="(\d*?)" data-end="(\d*?)">~',$valuePTagFull,$matches);
}
$TagFull .= $valuePTagFull;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]