demiux

Рейтинг
15
Регистрация
31.01.2017
borisd:
Ломается, если добавить:
[p title="b[abc]b"]bbb[/p]

А что не так?

все отлично, пока на месте все открывающиеся и закрывающиеся теги

Как выше уже говорил, если еще проверять валидность самих тегов - это уже совсем другая история.

---------- Добавлено 17.02.2017 в 19:45 ----------

silicoid:
demiux, у нас немного по-разному работает выпил из текста этих кодов. Видимо это из-за разной идеологии и изначально заложенных (додуманых) условий задачи
http://sandbox.onlinephpfunctions.com/code/4e1dc3b21db7217feea085728bb8b14fce1a036d

Не спорю, четкого ТЗ нет. Это уже из разряда проверки на валидность.

Stek:
Ну за 1 евро в час, оно то конечно так :D

О, и тут вы не в курсе новостей, цена уже 1.5€ в час:)

Stek, по задаче "олимпиады", затерянной в недрах двух топиков, нужно вырезать все теги и оставить ссылки. Про безопасность речи и не было. Этак мы придем еще и к валидации самих тегов.

Stek, все отлично, пока на месте все открывающиеся и закрывающиеся теги. Но решение конечно уже не очень то и короткое.

http://sandbox.onlinephpfunctions.com/code/32083dd21ac45c88fd79be3671d96bce8a6b67de

silicoid, вы не поняли, он обернут в ссылку и должен остаться как есть - ссылкой с текстом со скобочками.

Если это перенести на html код, то мы увидим такую <<<ссылку>>>. Ситуация не частая, но встречается. А ссылки по задаче трогать нельзя.

miltorg:
Нормальные пацаны всё уже решили давно в теме:

/ru/forum/comment/14931686

Нормальные пацаны признают за собой ошибки.

Aisamiery:
Тут уже совсем что то монстроузорное получается ))) Пойду в общем работать :)
Да надо было распарсивать теги а не просто их сносить)))

miltorg, но ваше решение вернее и короче на 146% и конечно же покрывает все ситуации.

silicoid:
кстати. Можно мой вариант еще подсократить, preg_replace('/\[(\w+).*\](.*)\[\/\1\]/imU', '$2', $input)

Разрешите докопаться:). Но тоже ломается об:

[a href="/kontakt" title="Контакт"][[[А тут текст внутри ссылки со скобочками]]][/a]

http://sandbox.onlinephpfunctions.com/code/462f5c5e896c1ac2a0d3bf722c9295ad28de6537

s/\[((?!a[\s\]])[^\s\]]+)[^\]]*\](.+?)\[\/\1\]/$2/gi;

Вот вариант для скобочек.

---------- Добавлено 17.02.2017 в 13:17 ----------

silicoid:
[offtop mode on]
кстати в Яндекс нужны хорошие программисты на Перле. С ног сбились найти не могут!

Я ушел с головой в js/node.js

silicoid:
мой вариант сожрал, как не странно ))

Потому что, что ваш:

silicoid:
так замените на preg_replace('/\[(\w+)(\]|.*\])(.*)\[\/\\1\]/imU', '$3', $input);
и на вас снова наступит счастье

Что мой:

demiux:
s/<((?!a[\s>])[^\s>]+)[^>]*>(.+?)<\/\1>/$2/gi;

Работают по одной аналогии.

Aisamiery:
Специально для вас, читабильность немного потерялось, но на то они и регулярные выражения.

Magic:
s/\[(((?!(a|\/a)).+?)|(\/?[\w]+){2})\]//g;

Это не вам адресовалось:). Но все равно "бьется" строка:

[a href="/kontakt" title="Контакт"][[[А тут текст со скобочками]]][/a]

Результат:

[a href="/kontakt" title="Контакт"]]][/a]
Всего: 102