php: PCRE для закрытия одиночных bb-тегов
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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' => '[\\1]\\2[/\\1]', Но (?!\[\/\\1\]) - вот эта часть, написана не правильно. Как ее изменить, чтобы проверялось до конца строки отсутствие [\/\\1] Спасибо за внимание PS: не уже ли никто не пытался это реализовать? И возможно ли вообще на PCRE?
|
|
|
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.
|
|
|
RE: php: PCRE для закрытия одиночных bb-тегов - 2007-01-03 18:02:32.490000
|
|
|
Kasper_WPS
Сообщений: 9
Оценки: 0
Присоединился: 2005-09-03 13:45:00
|
Спасибо! Несколько иначе реализовал. В принципе получилось почти тоже самое :)
|
|
|
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('/<(?!\/)(.*?)(\s.*?)?>/sie',"a('\\1')",$str);
preg_replace('/<\/(.*?)>/sie',"b('\\1')",$str);
end ($a);
while(1){
if (current($a)==1) $str.='</'.key($a).'>';
if (prev($a)==false) break;
}
return $str;
}
Корректна ли такая функция? Вроде работает. Что вы скажете?
|
|
|
|
|