[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярное выражение
Invis1ble
Никак не могу составить регулярное выражение для удаления незакрытых bb-тэгов.. Чувствую, что решение где-то рядом, но никак ухватить его не могу
Примерно так:
$mod_text = preg_replace('#(.*?)(\[b\]|\[i\]|\[u\]|\[s\])([^\[/\2\]]*?)\z#im' , '$1$3', $text);

Только вот загвоздка: в отрицательном классе получается любой из перечисленных символов, а надо чтобы была их последовательность.. Кто знает, как правильно это сделать?



Спустя 11 минут, 1 секунда (17.10.2010 - 23:31) kirik написал(а):
А зачем их удалять?
И почему бы не заменить закрытые бб-тэги на html-тэги, а потом пройтись второй регуляркой, которая удалит весь оставшийся "мусор".

Спустя 3 минуты, 44 секунды (17.10.2010 - 23:35) Invis1ble написал(а):
kirik
Ну не вообще я удалять собрался из БД, а из строки которая на выход идет
Цитата
И почему бы не заменить закрытые бб-тэги на html-тэги, а потом пройтись второй регуляркой, которая удалит весь оставшийся "мусор".
вот это я не понял, поясни что ты имеешь ввиду..

Спустя 10 минут, 40 секунд (17.10.2010 - 23:46) kirik написал(а):
"Я вам щас этого дядю покажу!"
define('BB_TAGS', 'b|i|u');

$str = '[b ]удаляем[/b] [i]не закрытые или не открытые[/u] bb-[u ]тэги[/u]';
// преобразуем в html
$str = preg_replace('#\[(' . BB_TAGS . ')\](.+?)\[/\\1\]#is', '<$1>$2</$1>', $str);
// убиваем то, что не преобразовалось
$str = preg_replace('#\[/?(' . BB_TAGS . ')\]#is', '', $str);
// и обратно, если надо
$str = preg_replace('#\<(' . BB_TAGS . ')\>(.+?)\</\\1\>#is', '[$1]$2[/$1]', $str);

echo $str;


* там пробелы убери в [b ] и в [u ]

Спустя 4 минуты, 14 секунд (17.10.2010 - 23:50) Invis1ble написал(а):
kirik
Точно! Вроде все верно, щас буду пробовать в действии..

Спустя 1 час, 44 минуты, 40 секунд (18.10.2010 - 01:34) Invis1ble написал(а):
kirik
К сожалению, не работает твой вариант:
<?php
$text = '[b*][u*]Вот такой вот [i*]текст[/i][/u] со вложенными псевдо-тегами[/b]';

$tags = 'b|i|u|s';
$mod_text = preg_replace('#\[(' . $tags . ')\](.+?)\[/\\1\]#i', '<$1>$2</$1>', $text);

echo $mod_text;

P.S. * поудаляй в коде

Спустя 2 часа, 6 минут, 22 секунды (18.10.2010 - 03:41) kirik написал(а):
Цитата (Invis1ble @ 17.10.2010 - 17:34)
К сожалению, не работает твой вариант:

И не должен smile.gif

Вот для вложенных:
$text = '[b*][u*]Вот такой вот [i*]текст[/i][/u] со вложенными псевдо-тегами[/b]';

function bb_replace($txt) {
$tags = 'b|i|u|s';
return preg_replace('#\[(' . $tags . ')\](.+?)\[/\\1\]#ie', '"<$1>" . bb_replace("$2") . "</$1>"', str_replace("\\'", "'", $txt));
}

echo bb_replace($text);

Спустя 9 часов, 27 минут, 2 секунды (18.10.2010 - 13:08) Invis1ble написал(а):
kirik
теперь вроде бы все нормально, кроме одного случая - с многострочным текстом не работает... sad.gif
добавляю модификатор m
preg_replace('#\[(' . $tags . ')\](.+?)\[/\\1\]#ime', '"<$1>" . bb_replace("$2") . "</$1>"', str_replace("\\'", "'", $txt));

не помагает

Спустя 54 минуты, 14 секунд (18.10.2010 - 14:02) Basili4 написал(а):
Invis1ble
на еще s добавить

Спустя 21 минута, 26 секунд (18.10.2010 - 14:24) Invis1ble написал(а):
Basili4
спасибо, а не мог ты объяснить почему работает именно с s, а не с m? Вроде наоборот должно..

Спустя 1 час, 28 минут, 25 секунд (18.10.2010 - 15:52) Basili4 написал(а):
Invis1ble
Мне, что то Дед Мороз рассказывал. У меня тоже такой же затык был. По моему s разрешает переходить с строки на другую строку. Что то такое.

Спустя 2 минуты, 58 секунд (18.10.2010 - 15:55) arvitaly написал(а):
С модификатором s - в точку входит \n - перенос строки

Спустя 4 часа, 3 минуты, 31 секунда (18.10.2010 - 19:58) Invis1ble написал(а):
Basili4
Я вообще кстати заметил, что DedMorozzz знаток регулярок по-ходу

arvitaly
а да, читал об этом, только не думал, что в этом причина.. спасибо

Спустя 46 минут, 40 секунд (18.10.2010 - 20:45) kirik написал(а):
Invis1ble
а m - это multiline, тоесть знаки ^ и $ (знаки начала и конца строки) принимают значение именно знаков начала и конца каждой строки в тексте.
c m:
^первая строка$
^вторая строка$
^...$

без m:
^первая строка
вторая строка
...$

Надеюсь понятен.. smile.gif

Спустя 11 минут, 36 секунд (18.10.2010 - 20:57) Invis1ble написал(а):
kirik
это я знаю, в первом посте в коде я как раз использую \z для нахождения конца строки, т.к. там у меня #m стоит


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.