2013-06-17 7 views
0

Учитывая частичный фрагмент HTML, такие какредактировать HTML текст с DomDocument

<div id="article"> 
    <p>Some text</p> 
    <p>More text</p> 
    <pre><code> 
     echo $variable; 
    </code></pre> 
</div> 

Я хочу проходным текстовых узлов и применить функцию к ним, на самом деле не важно, что делает эта функция, но если его текст в блоке предварительного кода.

Учитывая, что это частичный код, я думаю, мне нужно использовать DOMDocument->createDocumentFragment(). Но как я могу прокручивать текстовые узлы, а затем сохранять выходные данные без создания дополнительных тэгов <html>, поскольку saveHTML(), кажется, делает по умолчанию?

+0

использовать jquery append() .. добавить к событию –

ответ

1

Вы можете использовать фрагмент документа. Зацикливание на текстовых узлах - это легкая часть, и найти их немного сложно. Для этого в приведенном ниже примере используется запрос XPath для поиска всех текстовых узлов, которые не являются потомками элемента <pre>.

$doc = new DOMDocument; 
$xpath = new DOMXPath($doc); 

$frag = $doc->createDocumentFragment(); 
$frag->appendXML(<<<'HTML' 
<div id="article"> 
    <p>Some text</p> 
    <p>More text</p> 
    <pre><code> 
     echo $variable; 
    </code></pre> 
</div> 
HTML 
); 

$text_nodes = $xpath->query('descendant::text()[not(ancestor::pre)]', $frag); 
foreach ($text_nodes as $text_node) { 
    $text_node->data = strrev($text_node->data); 
} 

// Print the div 
echo $doc->saveHTML($frag->firstChild); 

Это напечатает что-то вроде:

<div id="article">  
<p>txet emoS</p>  
<p>txet eroM</p>  
<pre><code> 
     echo $variable; 
    </code></pre> 
</div> 

Полезные ссылки:

+0

Это прекрасно работает, спасибо. –

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