2

我有这种 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)可以使用,但对于 text 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;

4

3 回答 3

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();
?>
于 2012-08-25T21:19:50.853 回答
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

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

于 2012-08-25T05:59:07.020 回答
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;
?>

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

于 2012-08-25T07:20:56.550 回答