我有这种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>
我想用
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 = ' ' . $nodeA->nextSibling->nodeValue . ' ';
}
echo $doc->saveHtml();
?>
但是,
会被转义并转换为&nbsp;
答案 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
然后迭代节点列表,并根据需要添加
。
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
希望能让你朝着正确的方向前进。
答案 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]", " ", $doc->saveHtml());
echo $output;
?>
请随时发布更好的解决方案。