2

DOMxpath を使用して、テキスト ノードが空の HTML タグを削除しますが、<br/>タグは保持します。

$xpath = new DOMXPath($dom);

while(($nodeList = $xpath->query('//*[not(text()) and not(node()) and not(self::br)]')) && $nodeList->length > 0) 
{
    foreach ($nodeList as $node) 
    {
        $node->parentNode->removeChild($node);
    }
}

別の問題に遭遇するまでは完全に機能しますが、

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

この種の厄介な問題をどのように削除し<br/>ます<p>か? <br/>つまり、単独では許可したくありませんが、このような適切なテキストのみ<p>を許可します。<br/>

$content = '<p>first break <br/> second break <br/> the last line</p>'; 

それは可能ですか?

それとも正規表現の方がいいですか?

私はこのようなものを試しました、

$nodeList = $xpath->query("//p[text()=<br\s*\/?>\s*]");
    foreach($nodeList as $node) 
    {
        $node->parentNode->removeChild($node);
    }

しかし、それはこのエラーを返します、

Warning: DOMXPath::query() [domxpath.query]: Invalid expression in...
4

3 に答える 3

3

XPath を使用して不要な p を選択できます。

"//p[count(*)=count(br) and br and normalize-space(.)='']"

空のテキスト ノードを選択する場合は、(?) を使用する方がよいのではないことに注意してください。

"//*[normalize-space(.)='' and not(self::br)]"

これにより、次のようなテキスト ノードを除く任意の要素 (ただし br) が選択されます。

<p><b/><i/></p>

また

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

含まれています。

于 2011-07-27T09:48:21.927 に答える
1

<br />段落内にスペースとタグだけがあることを確認するだけで、それらをすべて取り除くことができます。preg_replace("\<p\>(\s|\<br\s*\/\>)*\<\/p\>","",$content);

内訳:

\<p\>    # Match for <p>
(        # Beginning of a group
  \s       # Match a space character
  |        # or...
  \<br\s*\/\> # match a <br /> tag, with any number (including 0) spaces between the <br and />
)*       # Match this whole group (spaces or <br /> tags) 0 or more times.
\<\/p\>  # Match for </p>

ただし、HTML が適切にフォーマットされていない限り (1 行、奇妙なスペースや段落クラスがないなど)、これを解析するために正規表現を使用しないでください。そうであれば、この正規表現は問題なく動作するはずです。

于 2011-07-27T06:13:16.893 に答える