2010-10-01 3 views
1

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

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

<div> 
    content 
    <div> 
     <div> 
     content 
       <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

Мне просто интересно узнать, что может привести к неравномерным тэгам html? – Catfish

ответ

5

Очень прочный способ очистки вывода HTML состоит в том, чтобы использовать расширение 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 вы можете играть, так что в основном это зависит от вас, как ваш выход будет выглядеть.

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

+1

+1 Tidy очень аккуратный. – Stewie

+0

Привет, спасибо! Будут ли эти чистые таблицы тоже? – atwellpub

+0

Да, он очищает все, что есть HTML. Зависит от настроек Tidy. –

0

Можете загрузить свой вывод в DOMDocument и попытаться вывести его с помощью formatOutput()? Могла бы работать красиво!

1

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

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

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

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

+0

Будет ли окружающий контент, скажем,

предотвратить ошибочное кодирование, влияющее на окружающие области? – atwellpub

+0

Я нашел, что содержимое в них не предотвращает ошибки форматирования – atwellpub

Смежные вопросы