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;そして、text1、text2、text3 をsで囲みたいと思います。最善の方法は何ですか?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

You should be able to use getElementsByTagName and then iterate over the node list, adding &nbsp; as necessary.

getElementsByTagName('body')

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

will return a nodelist

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

which you can then iterate over the individual items

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

the nodeType will let you know what you are dealing with. Text3 is a TEXT_NODE which has a value of 3

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

Hope that gets you going in the right direction.

于 2012-08-25T05:59:07.020 に答える
0

私が思いついた1つの解決策:

<?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 に答える