我遇到了这样的问题:
我的文字字符串如下:
<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;
}
有更好的方法吗?
答案 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)
这样的事情是如此多变,如此难以预测,一旦破碎就难以确定,我绝不会试图用我的双手解决这个问题。
尝试并确保它首先没有被破坏。通过htmltidy放置用户提交的内容,以便在数据进入后立即修复(或至少平滑)。
通过BeautifulSoup之类的东西扔掉它。在修复轻微的数据时,这是非常神奇的,你可以要求它以一种很好的方式输出它。 htmltidy可以做到这一点,但它不是那么强大的IMO。
不要依赖一个标签。嵌套数百个div会加剧这个问题。使用<summary>
和<article>
(以及其他)等HTML5标签有助于将损坏限制在躲藏区域。
答案 2 :(得分:0)
可以将输出加载到DOMDocument,并尝试使用formatOutput()
输出吗?可以很好地工作!