5

<br/>前後にテキストがない場合、どうすれば削除できますか?

例えば、

<p><br/>hello</p>
<p>hello<br/></p>

このように書き換える必要があります。

<p>hello</p>
<p>hello</p>

DOMxpath を使用するか、正規表現を使用する必要がありますか?

(注:以前に DOMxpath での削除に関する投稿がありましたが、この問題に遭遇しました!)<p><br/></p>

編集:

入力にこれがある場合、

$content = '<p><br/>hello<br/>hello<br/></p>';

それならそうあるべき

<p>hello<br/>hello</p>'
4

2 に答える 2

4

上記のbrを選択するには、次を使用できます。

 "//p[node()[1][self::br]]/br[1] | //p[node()[last()][self::br]]/br[last()]"

または、(おそらく)より高速です:

 "//p[br]/node()[self::br and (position()=1 or position()=last())]"

p の最初 (または最後) のノードが br のときに br を取得するだけです。

これにより、次のような br が選択されます。

<p><br/>hello</p>
<p>hello<br/></p>

最初と最後の br のように:

<p><br/>hello<br/>hello<br/></p>

次のような中間の br ではありません。

<p>hello<br/>hello</p>

PS: 最終的に次のようなペアの最初の br を取得するには<br/><br/>:

"//br[following::node()[1][self::br]]"
于 2011-07-27T13:14:48.820 に答える
0

一部のコードの場合、このように動作させることができます ( Demo )。これは、@empo の xpath を (ごくわずかに) わずかに変更したもので、一致の削除とさらにいくつかのテスト ケースを示しています。

$html = <<<EOD
<p><br/>hello</p>
<p>hello<br/></p>
<p>hello<br/>Chello</p>
<p>hello <i>molly</i><br/></p>
<p>okidoki</p>
EOD;

$doc = new DomDocument;
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$nodes = $xpath->query('//p[node()[1][self::br] or node()[last()][self::br]]/br');
foreach($nodes as $node) {
    $node->parentNode->removeChild($node);
}
var_dump($doc->saveHTML());
于 2011-07-27T13:25:01.243 に答える