使用php修复不均匀的Div

时间:2010-10-01 18:07:43

标签: php html-parsing

我遇到了这样的问题:

我的文字字符串如下:

<div>
    content
    <div>
         <div>
         content
              <div>

         </div>
    </div>

如果您发现我错过了一些div,当我在其他地方使用此内容时,这可能会破坏我的主题。

解决此类问题的最佳方法是什么?这就是我自己拥有的,但往往不够好。此函数试图通过不修复它来解决问题,而是将其打包以防止破坏的html破坏我的其他HTML的可能性。

 function ($string)
 {
     $div_open = substr_count($string, "<div");   
     $div_close = substr_count($string, "</div>"); 

     while ($div_close<$div_open)
     {    
         $string = "$string</div>";
         $div_close = substr_count($string, "</div>");
         if ($i>1000){echo 'pop 3'; exit;}else{$i++;}
     }
     while ($div_close>$div_open)
     {    
         $string = "<div>$string";
         $div_open = substr_count($string, "<div");
         if ($i>1000){echo 'pop 4 '; exit;}else{$i++;}
     }

     return $string;
 }

有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

清理HTML输出的非常可靠的方法是使用PHP的Tidy扩展名。

您可以执行以下操作:

$text = '<div>content<div><div>content<div></div></div>';

$tidy = tidy_parse_string( $text );
$tidy->cleanRepair( );

echo $tidy;

,您的HTML输出将如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<title></title>
</head>
<body>
<div>content
<div>
<div>content</div>
</div>
</div>
</body>
</html>

你可以玩很多settings of Tidy,所以基本上由你决定你的输出会是什么样的。

缺点是Tidy有时喜欢做你真正不想看到的事情。如果你的HTML代码没有被严重搞砸,我推荐它。

答案 1 :(得分:1)

这样的事情是如此多变,如此难以预测,一旦破碎就难以确定,我绝不会试图用我的双手解决这个问题。

  1. 尝试并确保它首先没有被破坏。通过htmltidy放置用户提交的内容,以便在数据进入后立即修复(或至少平滑)。

  2. 通过BeautifulSoup之类的东西扔掉它。在修复轻微的数据时,这是非常神奇的,你可以要求它以一种很好的方式输出它。 htmltidy可以做到这一点,但它不是那么强大的IMO。

  3. 不要依赖一个标签。嵌套数百个div会加剧这个问题。使用<summary><article>(以及其他)等HTML5标签有助于将损坏限制在躲藏区域。

答案 2 :(得分:0)

可以将输出加载到DOMDocument,并尝试使用formatOutput()输出吗?可以很好地工作!