Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

php: PCRE для закрытия одиночных bb-тегов

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> php: PCRE для закрытия одиночных bb-тегов
Имя
Сообщение << Старые топики   Новые топики >>
php: PCRE для закрытия одиночных bb-тегов - 2007-01-02 21:32:10.126666   
Kasper_WPS

Сообщений: 9
Оценки: 0
Присоединился: 2005-09-03 13:45:00
Проблема в том, что необходимо во всем тексте найти не закрытые bb-теги и закрыть их, простите за тафтологию :)

[ p ]Пример моей глупости :)

Как видите нет закрывающего тега [ / p ] Как должно выглядеть регулярное выражение для замены? Вот что-то пытался написать:

'/\[(p|pre|li|center|i|b|u|code|php|sql|url|img)\](.*?)(?!\[\/\\1\])/si' =&gt; '[\\1]\\2[/\\1]',
Но (?!\[\/\\1\]) - вот эта часть, написана не правильно. Как ее изменить, чтобы проверялось до конца строки отсутствие [\/\\1]

Спасибо за внимание
PS: не уже ли никто не пытался это реализовать? И возможно ли вообще на PCRE?
Post #: 1
RE: php: PCRE для закрытия одиночных bb-тегов - 2007-01-03 17:17:28.970000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
если тебе не принципиально делать это исключительно через регекспы, то сделай примерно так:
1) найдем следующий тег, если не удалось то идём в 5)
2) если тег открывающий то положим его в стек и перейдём к 1)
3) если в верхушке стека лежит тег с именем несовпадающим с только что найденным, то это значит что надо вставить закрывающий тег с именем того что в верхушке стека
4) выдернем из стека верхушку и идём в 1)
5) если стек не пуст, то выдёргиваем в цикле из него теги по одному, и дописываем одноимённые закрывающие

ну это всё из предположения что конструкция: [i][b][/i][/b] не верна. если же такое катит, то можно просто перебирая теги коллекционировать незакрытые, а потом просто выполнить шаг 5.
Post #: 2
RE: php: PCRE для закрытия одиночных bb-тегов - 2007-01-03 18:02:32.490000   
Kasper_WPS

Сообщений: 9
Оценки: 0
Присоединился: 2005-09-03 13:45:00
Спасибо! Несколько иначе реализовал. В принципе получилось почти тоже самое :)
Post #: 3
RE: php: PCRE для закрытия одиночных bb-тегов - 2007-01-03 21:19:27.110000   
Kasper_WPS

Сообщений: 9
Оценки: 0
Присоединился: 2005-09-03 13:45:00
function correcthtml($str){ $GLOBALS['a']=array(); global $a; if (!function_exists('a')){ function a($a){ @$GLOBALS['a'][$a]++; return 0; } function b($a){ @$GLOBALS['a'][$a]--; return 0; } } preg_replace('/&lt;(?!\/)(.*?)(\s.*?)?&gt;/sie',"a('\\1')",$str); preg_replace('/&lt;\/(.*?)&gt;/sie',"b('\\1')",$str); end ($a); while(1){ if (current($a)==1) $str.='&lt;/'.key($a).'&gt;'; if (prev($a)==false) break; } return $str; } Корректна ли такая функция? Вроде работает. Что вы скажете?
Post #: 4
Страниц:  [1]
Все форумы >> [Веб-программинг] >> php: PCRE для закрытия одиночных bb-тегов







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.