2011-12-22 53 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 2011-12-22 15:56:02

+0

您的輸入是否爲「有效的XHTML」?如果是這樣,一個xslt可以成爲你的情況的解決方案。 – 2011-12-22 15:58:20

+0

你還怎麼從表單中清除WYSIWYGs的輸入?多個str_replace爲每個案件? – Kevin 2011-12-22 16:31:32

回答

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標籤僅看?每行可以有幾個?

另一個使用的normal* (special normal*)*有:

  • 正常:\s
  • 特殊:(&nbsp;|<br\s*/>)

(非捕獲組)

0

我曾在本作大概一天,看到了很多「不使用正則表達式」,我同意。

但是,我的DOMDocument與我的html實體搞混了。我會仔細過濾文本,以便所有的TM符號都被轉換爲HTML實體,如& trade;但它會將它們轉換回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(); 
}