2012-08-25 28 views
2

我有這種HTML文檔。將 加入到PHP中未標記的HTML文本中

<span class="class1">text1</span> 
<a href="">link1</a> 
<font color=""><b>text2</b></font> 
<a href="">link2</a> 
text3 
<span class="class2">text4</span> 

而且我想用&nbsp; s圍繞text1,text2和text3。什麼是最好的方法? DomDocument無法捕獲未標記的字符串。對於text1和text2,可以使用getElementByTagName('tagname')->item(0),但對於文本3,我不知道該怎麼做。

任何想法?

[編輯]

由於穆薩建議,我試過使用nextSibling。

<?php 
$html = <<<STR 
    <span class="class1">text1</span> 
    <a href="">link1</a> 
    <font color=""><b>text2</b></font> 
    <a href="">link2</a> 
    text3 
    <span class="class2">text4</span> 
STR; 

$doc = new DOMDocument; 
$doc->loadHTML($html); 
foreach ($doc->getElementsByTagName('a') as $nodeA) { 
    $nodeA->nextSibling->nodeValue = '&nbsp;' . $nodeA->nextSibling->nodeValue . '&nbsp;'; 
} 
echo $doc->saveHtml(); 
?> 

然而,&nbsp;被逃了出來,轉化爲&amp;nbsp;

+0

如何'getElementByTagName( 'A')[1] .nextSibling' – Musa

+0

謝謝,我更新的初始訊息。 – Teno

+0

由於引擎似乎是逃避角色,你可以在節點前後追加空格。然後引擎可以將它轉換爲' '。 – mrtsherman

回答

3

由於設置該值似乎將其設置爲文本而不是html,因此您可以使用非分隔空格字符而不是html實體。

<?php 
$html = <<<STR 
    <span class="class1">text1</span> 
    <a href="">link1</a> 
    <font color=""><b>text2</b></font> 
    <a href="">link2</a> 
    text3 
    <span class="class2">text4</span> 
STR; 
$nbsp = "\xc2\xa0"; 
$doc = new DOMDocument; 
$doc->loadHTML('<div>' . $html . '</div>'); 

foreach($doc->getElementsByTagName('div')->item(0)->childNodes as $node) { 
    if ($node->nodeType == 3) {  // nodeType:3 TEXT_NODE 
     $node->nodeValue = $nbsp . $node->nodeValue . $nbsp; 
    } 
} 
echo $doc->saveHtml(); 
?> 
+0

我得到反引號而不是空格。 – Teno

+0

@Teno我有''\ xc1 \ xa0''它假設是''\ xc2 \ xa0'' – Musa

+0

Wao,它工作正常!謝謝! – Teno

2

您應該能夠使用getElementsByTagName,然後遍歷節點列表,添加必要的&nbsp;

getElementsByTagName('body') 

http://php.net/manual/en/domdocument.getelementsbytagname.php

將返回nodelist

http://www.php.net/manual/en/class.domnodelist.php

然後你可以遍歷各個項目

http://www.php.net/manual/en/domnodelist.item.php

nodeType會讓你知道你在處理什麼。文本3是具有的3

https://developer.mozilla.org/en-US/docs/DOM/Node.nodeType?redirectlocale=en-US&redirectslug=nodeType

值。希望讓你在正確的方向前進一TEXT_NODE。我想出了

+0

感謝您的參考。我會看看我是否可以理解他們使用。 – Teno

+0

我仍然希望一些工作示例,因爲我在更新的帖子中嘗試不起作用。我試圖覆蓋nodeValue但字符被轉義。 – Teno

0

一個解決方案:

<?php 
$html = <<<STR 
    <span class="class1">text1</span> 
    <a href="">link1</a> 
    <font color=""><b>text2</b></font> 
    <a href="">link2</a> 
    text3 
    <span class="class2">text4</span> 
STR; 

$doc = new DOMDocument; 
$doc->loadHTML('<div>' . $html . '</div>'); 

foreach($doc->getElementsByTagName('div')->item(0)->childNodes as $node) { 
    if ($node->nodeType == 3) {  // nodeType:3 TEXT_NODE 
     $node->nodeValue = '[identical_replacement_string]' . $node->nodeValue . '[identical_replacement_string]'; 
    } 
} 
$output = str_replace("[identical_replacement_string]", "&nbsp;", $doc->saveHtml()); 
echo $output; 
?> 

請隨意張貼更好的解決方案。

相關問題