【问题标题】:PHP DOMDocument, wrap all elements without node with pPHP DOMDocument,用p包装所有没有节点的元素
【发布时间】:2016-05-31 22:25:53
【问题描述】:

我从 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)));

【问题讨论】:

    标签: php html class dom domdocument


    【解决方案1】:

    从技术上讲,该文本已经在 "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>
    

    关键是选择所有没有p祖先的非空文本节点,使用//text()[not(ancestor::p)][normalize-space()] XPath查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多