PHP - DOMDocument - 获取前一个元素及其数据属性

PHP - DOMDocument - Get the previous element and his data attributes

您好,我正在尝试通过字符串管理 DOM文档。 我的字符串看起来像这样:

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

我的目标是将单词 WORD3WORD4 放在 <div> 标签中,例如 WORD1 WORD2WORD5 WORD6 第一个和最后一个 <p> 标签。另外,我需要得到前一个 p > divdata-start data-end 并最终得到这个:

$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-startdata-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-startdata-end 属性的前一个 <p> >> <div>

但是如何 select 并使用 DOM、XML 或其他方式从前一个元素获取属性?

谢谢!

我想您可以使用正则表达式获取开始结束的最后一个值,但不会使用 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;