使用php修复不均匀的Div

atw*_*pub 1 php html-parsing

我有一个看起来像这样的问题:

我的文本字符串如下:

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

         </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

如果你注意到我错过了一些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;
 }
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Ond*_*ták 5

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

您可以执行以下操作:

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

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

echo $tidy;
Run Code Online (Sandbox Code Playgroud)

并且您的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>
Run Code Online (Sandbox Code Playgroud)

还有很多你可以玩的Tidy设置,所以基本上由你决定你的输出会是什么样子.

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