2011-12-22 33 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(); 
}