2011-07-26 1 views
2

私は、この種のを削除するにはどうすればよいDOMxpathまたは正規表現を使用して<p><br/></p>を削除しますか?

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

、私は別の問題に出くわしたまでそれが完璧に動作

$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); 
    } 
} 

<br/>タグを維持するが、空のテキストノードを持つHTMLタグを削除するにはDOMXPathを使うことの最大を使用汚い<br/><p>?私は<p>単独<br/>を許可する必要はありませんが、私はこれだけのような適切なテキストで<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... 
+0

何が '


ハロー

'と '

ハロー

'になりますか?さらに多くのテストケースを提供できますか?私は少し解決策を持っているようですが、すべての場合を満たしているかどうかはわかりません。 –

+0

良い質問!私はちょうどそれを考えている!理想的には、テキストの前または後に '
'を削除したいと思います。出来ますか?私の新しい投稿を見てください - http://stackoverflow.com/questions/6844646/how-can-i-remove-br-if-no-text-comes-before-or-after-it-domxpath-or -regex – laukok

答えて

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> 

含まれています。

+1

答えがそれほどです! – laukok

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行、奇妙なスペースや段落クラスなど)、これを解析するために正規表現を使用しないでください。そうであれば、この正規表現はうまくいくはずです。

1

私はほとんど同じような状況があり、私が使用します。

$document->loadHTML(str_replace('<br>', urlencode('<br>'), $string_or_file)); 

、ディスプレイやデータベースに挿入するためにそれをバックに変更するurlencode()を使用しています。 私の仕事です。

関連する問題