2012-08-25 48 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; 
?> 

请随意张贴更好的解决方案。