#php #codeigniter #replace #markup
#php #codeigniter #заменить #разметка
Вопрос:
у меня есть страница, на которой пользователи размещают свои собственные сообщения, пользователи могут разметить свои сообщения такими тегами, как :
{strong}{/strong} or {italic}{/italic} or {title}{/title} etc ...
для меня сложно сделать так, чтобы они не вторгались между собой.
я имею в виду, что это нормально:
{strong}{/strong} {italic}{/italic}
но мне нужно избегать всех возможных случаев, подобных этим:
{strong}{italic}{/strong}{/italic}
{italic}{strong}{/italic}{italic}{/strong}{/italic}
{italic}{/strong}{/italic}{/strong}{/italic}
и так далее … на самом деле слишком много случаев, чтобы написать 1 элемент управления для каждого, я думаю: P
логика должна заключаться в том, чтобы всегда разделять их и удалять ненужные или включенные теги … надеюсь, вопрос ясен: P
Комментарии:
1. Используйте синтаксический анализатор на основе стека. Или, что еще лучше, не изобретайте велосипед и используйте существующий анализатор кода ubb.
2. почему? 🙁 я хотел бы сделать это личным 🙁
3. Замена порядка тегов немного сложна, но чтобы удалить лишние закрывающие теги, попробуйте использовать положительный конец,
(?<=foo)bar
чтобы избавиться от них.4. чтобы сделать это личным, вы можете просто посмотреть на предыдущую разметку, а методы имитируют их и изменяются в соответствии с вашими спецификациями.
5. ubb выглядит так [b][i]test[/i] [/b], он также называется BBCode .
Ответ №1:
Общее решение вашей проблемы — разработать анализатор рекурсивного спуска или анализатор на основе стека, но, вероятно, это полный перебор для вашей ситуации.
Сопоставление начальных тегов с конечными тегами в целом очень похоже на язык сбалансированных круглых скобок (например: (), (()), (()()) правильно сбалансированы, )(, ()(, )(()() не являются). Язык сбалансированных круглых скобок не является обычным языком и, следовательно, не может быть «проанализирован» с использованием регулярных выражений (если вы не можете ограничить глубину, на которую они могут быть вложены, см. Здесь ).
Я бы посоветовал вам преобразовать все ваши псевдотеги в реальные теги html, а затем проанализировать их с помощью объектной модели документа PHP.
Комментарии:
1. ну, я буду документировать себя, проблема в том, что я бы не хотел конвертировать html-теги перед сохранением в db, спасибо в любом случае!
2. Нет проблем. Вы всегда можете преобразовать обратно в свои псевдотеги после проверки.