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

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

Andex

Новичок
а если Tidy не установлен?
хотелось бы более универсального решения, которое будет работать везде
 

Korner

Новичок
сделать explode по "<div"
проверить, если в последнем элементе полученном массива нет закрывающегося </div>, то добавить в конец строки закрывающийся </div>

не?
 

Andex

Новичок
Korner
хм, стОит попробовать

-~{}~ 14.12.08 22:45:

Korner
В общем, так и реализовал. Спасибо за идею!
 

mani13

Новичок
Регулярные выражения, explode...
PHP:
if (strrpos($str, '<div') > strrpos($str, '</div')) $str .= '</div>';
 

Andex

Новичок
mani13
согласен, это изящнее

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

Спасибо и вам
 

mani13

Новичок
Автор оригинала: Andex
согласен, это изящнее

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

Это не только изящнее, но и не плодит лишних массивов.
 

Andex

Новичок
nerezus
что это? расшифруйте...

Активист
я уже говорил, мне нужно универсальное решение, которое будет работать везде, независимо от наличия tidy
 

mani13

Новичок
nerezus
Так же как не будет работать любое другое решение, не являющееся полноценным парсером.
 

nerezus

Вселенский отказник
Andex
Твое "универсальное решение" не будет работать правильно. Тебе нужен полноценный лексер, а не замена.
В моем примере текст, на которым замена будет спотыкаться.
 

Активист

Активист
Команда форума
Andex
А если у тебя на сервере не будет PHP, какое "универсальное средство" ты будешь использовать?

Что за желание делать гавно.
 

Andex

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

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

На этом тему считаю исчерпанной, всем спасибо.
 

HraKK

Мудак
Команда форума
Конечно в таком случае надо ставить 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);
Ведь этот код будет слабо нагружать тачку и быстрее проходить, что позволит компам захватить вселенную!
 

Andex

Новичок
nerezus
Отнюдь, воруют у меня. Если вам так интересно, этот хтмл попадает на обработку из wysiwyg-редактора, обрезка происходит для превью материала. происходит она таким образом, что div может оказаться открытым, что рушит верстку.
 
Сверху