Исправить неровные Div с PHP - PullRequest
1 голос
/ 01 октября 2010

У меня есть проблема, которая выглядит следующим образом:

Моя строка текста выглядит так:

<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 ]

5 голосов
/ 01 октября 2010

Очень надежный способ очистить вывод HTML - использовать Tidy расширение PHP.

Вы можете сделать следующее:

$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>

Существует также довольно много настроек Tidy , с которыми вы можете поиграть, так что в основном все зависит от вас, как будет выглядеть ваш вывод.

Недостатком было бы то, что Тиди иногда нравится делать вещи, которые вы действительно не хотите видеть. Если ваш HTML-код действительно не испорчен, я рекомендую его.

1 голос
/ 01 октября 2010

Подобные вещи настолько изменчивы, непредсказуемы и настолько сложны, что их невозможно сломать, сломав их, я бы никогда не попытался исправить это голыми руками.

  1. Попробуйте и убедитесь, что этоне сломан в первую очередь.Поместите пользовательский контент через htmltidy, чтобы он был исправлен (или, по крайней мере, сглажен), как только данные поступят.

  2. Бросьте его через что-то вроде BeautifulSoup.Это довольно волшебно, когда дело доходит до исправления слегка искаженных данных, и вы можете попросить их вывести их также хорошим способом.htmltidy может кое-что из этого сделать, но он не такой мощный IMO.

  3. Не полагайтесь на один тег для всего.Вложение сотен div'ов усугубит эту проблему.Использование HTML5-тегов, таких как <summary> и <article> (и других), поможет ограничить ущерб только изворотливой областью.

0 голосов
/ 01 октября 2010

Не могли бы вы загрузить ваш вывод в DOMDocument и попробовать вывести его с formatOutput()?Может работать хорошо!

...