2011-12-22 5 views
0

私のHTMLに空のタグを取り除くための助けが必要です。そこここソリューションです:文書から空のHTMLを削除する

Remove empty tags using RegEx

は、しかし、私はJS、and I should never use Regular expressions to parse HTMLを使用することはできません。

私はPHPで入力を消去する必要があります。また、空のタグ以外のものも必要です。

私はまた、このようなタグをキャッチする必要があります。

<p> </p> (variable whitespace with nothing in the tag) 
<p>&nbsp;</p> 
<p><br/><p> 
<p><br /></p> 

私はそれがデータベース(WYSIWYGs)にそれを作る前に、そのように悪いマークアップをキャッチするために何ができますか?

+5

は、正規表現を使用していませんxml/htmlの場合 – dave

+0

あなたの入力は「有効なXHTML」ですか?もしそうなら、xsltはあなたの場合の解決策になります。 –

+0

フォームのWYSIWYGから入力を消去するにはどうすればよいですか?それぞれの場合に複数のstr_replace? – Kevin

答えて

4

チェック、a document object model parserとそれを解析ノードのテキストコンテンツ、条件を満たすノードを削除する(スクリプトタグとして解析する、w hitespaceは、iframeなど)です。

コメントセクションにもかなりのサンプルコードがあります。私は、この上で働いていた

ここではそのような何か(ランダムカット+ php.netに貼り付けるから採用)んコードの束だ

<?php 

$sampleHTML = " 
<p> </p> 
<p> &nbsp; <p> 
<p><br/></p> 
<p><br /></p> 
<span>Non-empty span<p id='NestedEmptyElement'></p></span> 
"; 

$doc = new DOMDocument(); 
$doc->loadHTML($sampleHTML); 
$domNodeList = $doc->getElementsByTagname('*'); 
$domElemsToRemove = array(); 
foreach ($domNodeList as $domElement) { 
    $domElement->normalize(); 
    if (trim($domElement->textContent, "\xc2\xa0 \n \t ") == "") { 
    $domElemsToRemove[] = $domElement; 
    } 
} 

foreach($domElemsToRemove as $domElement){ 
    try { 
     $domElement->parentNode->removeChild($domElement); 
    } catch (Exception $e) { 
     //node was already deleted. 
     //There's a better way to do this, it's recursive. 
    } 
} 


$domNodeList = $doc->getElementsByTagname('body')->item(0); 
$childNodes = $domNodeList->childNodes; 

foreach ($childNodes as $domElement) { 
    echo trim($domElement->C14N()); 
} 

echo "\n\n"; 

その後、我々は実行..

$ php foo.php -v 
<span>Non-empty span</span> 
2

あなたの例ともう少し一致します

^<p>\s*(?:(?:&nbsp;|<br\s*/>)\s*)*</p>$ 

しかし、あなたは唯一のpタグを探していますか? 1行に複数のことができますか?

normal* (special normal*)*のさらに別の使用

  • 正常:\s
  • 特別な(非捕捉基を有する)(&nbsp;|<br\s*/>)

0

約1日で、私が同意する多くの "正規表現を使用しない"ことがわかりました。

しかし、私はDOMDocumentに大きな問題を抱えていました。すべてのTMシンボルが& tradeのようなHTMLエンティティに変換されるように、慎重にテキストをフィルタリングします。それをTM記号に戻します。

私はしばらくの間この動作を防ぐことで戦っていました。このためにいくつかのハックがありました。戦っの日の後、私は「なぜ私が動作するようにそれをハックするのは難しい動作するはずそれがうまく動作するはずです..?」と思ったし、私は10分などにsimplehtmldomを使用して、この機能を書いた:

function stripEmptyTags($html){ 
    $dom = new simple_html_dom(); 
    $dom->load($html); 
    foreach($dom->find("*") as $e) 
     if(trim(str_replace(array(' ','&nbsp;'), "", $e->innertext)) == "") 
      $e->outertext = ""; 
    $dom->load($dom->save()); 
    return $dom->save(); 
} 
関連する問題