在PHP中添加到未标记的HTML文本

时间:2012-08-25 05:23:59

标签: php domdocument html-manipulation

我有这种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,我不知道该怎么做。

有什么想法吗?

[编辑]

正如Musa所说,我尝试使用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;

3 个答案:

答案 0 :(得分:4)

由于设置值似乎将其设置为文本而不是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();
?>

答案 1 :(得分: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将告诉您正在处理的内容。 Text3是TEXT_NODE,其值为3

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

希望能让你朝着正确的方向前进。

答案 2 :(得分: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;
?>

请随时发布更好的解决方案。