помогите с регулярным выражением, необходимо закрыть открытый html-тег

  • Автор темы Автор темы Andex
  • Дата начала Дата начала

Andex

Новичок
помогите с регулярным выражением, необходимо закрыть открытый html-тег

В общем задача такова: нужно закрыть последний незакрытый тег <div>

Пример

имеем такую строку
Код:
111111<div>2</div>33333<div>44444
должны получить
Код:
111111<div>2</div>33333<div>44444</div>
или, имеем
Код:
111111<div>2</div>33333<div>
=>
Код:
111111<div>2</div>33333<div></div>

или
Код:
111111<div class="">2</div>33333<div style="" align=""><img src="">
нужно получить
Код:
111111<div class="">2</div>33333<div style="" align=""><img src=""></div>

Есть условие, что все <div> до последнего закрыты. Незакрытым может быть только последний, но может быть и закрыт (в таком случае ничего менять не нужно)
 
а если Tidy не установлен?
хотелось бы более универсального решения, которое будет работать везде
 
сделать explode по "<div"
проверить, если в последнем элементе полученном массива нет закрывающегося </div>, то добавить в конец строки закрывающийся </div>

не?
 
Korner
хм, стОит попробовать

-~{}~ 14.12.08 22:45:

Korner
В общем, так и реализовал. Спасибо за идею!
 
Регулярные выражения, explode...
PHP:
if (strrpos($str, '<div') > strrpos($str, '</div')) $str .= '</div>';
 
mani13
согласен, это изящнее

(только переменные в strripos местами перепутали)

Спасибо и вам
 
Автор оригинала: Andex
согласен, это изящнее

(только переменные в strripos местами перепутали)
Поправил места...

Это не только изящнее, но и не плодит лишних массивов.
 
nerezus
что это? расшифруйте...

Активист
я уже говорил, мне нужно универсальное решение, которое будет работать везде, независимо от наличия tidy
 
nerezus
Так же как не будет работать любое другое решение, не являющееся полноценным парсером.
 
Andex
Твое "универсальное решение" не будет работать правильно. Тебе нужен полноценный лексер, а не замена.
В моем примере текст, на которым замена будет спотыкаться.
 
Andex
А если у тебя на сервере не будет PHP, какое "универсальное средство" ты будешь использовать?

Что за желание делать гавно.
 
Активист
Это совсем некорректное сравнение. Пришли поумничать? Спасибо, до вас уже двое посоветовали tidy, смотрите выше. Вашу точку зрения я понял. У меня есть определенные причины отказаться от модуля, отсутствующего на большинстве шаред-хостингов по дефолту. До свидания.

nerezus
Согласен, но в данном случае подобного кода не будет. Я знаю откуда берется этот хтмл, и знаю что он собой представляет. Фактически, незакрытый див появляется там после банальной обрезки. В моем случае, проблему полностью решают вышеприведенные примеры.

На этом тему считаю исчерпанной, всем спасибо.
 
Конечно в таком случае надо ставить tidy ну и по крайней мере обязательно регуляркой.
PHP:
<?php
$string = '111111<div>2</div>33333<div>44444';
$opened = $closed = 0;
str_ireplace( '<div','',$string, $opened );
str_ireplace( '</div','',$string, $opened );
if( $opened > $closed )
{
    $string .= '</div>';
}
echo $string;
или
PHP:
<?php
$string = '111111<Div>2</div>33333<div>44444';
$opened = $closed = 0;
$string = strtolower($string);
if( substr_count( $string,'<div') > substr_count( $string,'</div') )
{
    $string .= '</div>';
}
echo htmlspecialchars($string);
Ведь этот код будет слабо нагружать тачку и быстрее проходить, что позволит компам захватить вселенную!
 
nerezus
Отнюдь, воруют у меня. Если вам так интересно, этот хтмл попадает на обработку из wysiwyg-редактора, обрезка происходит для превью материала. происходит она таким образом, что div может оказаться открытым, что рушит верстку.
 
Сверху