簡體   English   中英

PHP DOMDocument,使用p包裝所有沒有節點的元素

[英]PHP DOMDocument, wrap all elements without node with p

我從RTE獲得HTML。 之后,我將使用DOMDocument類來處理其內容。

編輯器有時會給我文本而沒有節點,例如:

<p>This is some text inside a text-node</p>
This is text without any node and should be wrapped with a text-node

是否可以使用DOMDocument使用文本節點包裝此文本?

我在函數中使用以下代碼:

    $dom = new \DOMDocument();
    $dom->loadHTML($MY_HTML);

    $xpath = new \DOMXPath($dom);

    foreach ($xpath->query('//p') as $k => $paragraph) {
        $paragraph->setAttribute('class', $paragraph->getAttribute('class') . ' bodytext');
    }

    $body = $xpath->query('/html/body');
    return preg_replace('/^<body>|<\/body>$/', '', $dom->saveXml($body->item(0)));

從技術上講,文本已經在“ text node”內 ,但這會將所有未包裝的文本節點與段落節點包裝在一起:

<?php

$html = <<<'END'
<div>
    <p>This is some text inside a text-node</p>
    This is text without any node and should be wrapped with a text-node
</div>
END;

$doc = new \DOMDocument();
$doc->loadHTML($html, LIBXML_HTML_NOIMPLIED);

$xpath = new \DOMXPath($doc);
$nodes = $xpath->query('//text()[not(ancestor::p)][normalize-space()]');

foreach ($nodes as $node) {
    $p = $doc->createElement('p', htmlspecialchars(trim($node->textContent)));
    $node->parentNode->replaceChild($p, $node);
}

print $doc->saveHTML($doc->documentElement);

// <div>
//   <p>This is some text inside a text-node</p>
// <p>This is text without any node and should be wrapped with a text-node</p>
// </div>

關鍵是使用//text()[not(ancestor::p)][normalize-space()] XPath查詢來選擇所有沒有p祖先的非空文本節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM