2016-02-19 5 views
0

Я получаю HTML из RTE. Затем я манипулирую его содержимым классом DOMDocument.PHP DOMDocument, обернуть все элементы без узла с помощью p

Редактор иногда дает мне текст без узла, например .:

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

ответ

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 с использованием запроса XPath //text()[not(ancestor::p)][normalize-space()].

 Смежные вопросы

  • Нет связанных вопросов^_^