Regex обрезает слишком много символов – иногда

  • Автор темы Mzarh
  • Обновлено
  • 17, May 2024
  • #1
Я пытаюсь создать конструктор форм, который мои пользователи смогут использовать с собственной разметкой, вдохновленной BBCode, преобразующей их вопросы в настоящий HTML. У меня есть регулярное выражение "скрипка" в https://regex101.com/r/5uf7fK/1

У меня есть два примера

 [RADIO|This is a periodic tenancy,This tenancy ends on [TEXT|enter date]]


Код (разметка): и регулярное выражение, которое я использую,

 preg_match_all("/\[([^\]]*)\]/", $block, $matches);


PHP: Итак, вот что я получаю

В идеале хотелось бы работать с полным результатом матча и первый результат был бы хорошим.

Во втором результате мой ожидаемый результат:

 Name: [TEXT|enter your name here] Type of tenancy: [RADIO|This is a periodic tenancy,This tenancy ends on [TEXT|enter date]]


Код (разметка): но регулярное выражение обрезает второй ]

Кто-нибудь знает, как я могу отредактировать это, чтобы оно возвращало оба]?

Mzarh


Рег
05 Mar, 2013

Тем
65

Постов
182

Баллов
507
  • 20, May 2024
  • #2
Решение предоставляет не один RegEx. Вы можете иметь несколько вложенных тегов [] в любом месте тега [].... Анализ этого может оказаться довольно сложным.... Ваш лучший вариант - использовать библиотеку синтаксического анализа BBCode и соответствующим образом отредактировать ее для поддержки вашего временного bb-кода.

Я предлагаю использовать расширение PHP "BBCode" или использовать импровизированный класс, который существует и хорошо протестирован, а затем отредактировать его в соответствии с вашей спецификацией.

ЕСЛИ ваш «bbcode» представляет собой не что иное, как заменяемые теги или простые блоки тегов, вы можете в конечном итоге сделать что-то простое, например, preg_replace...

У меня есть пример, но этот форум не принимает код

Изменить: Простой пример: https://tehplayground.com/ipevj5c4WOhWYRWl
 

Cubata


Рег
01 Jan, 2011

Тем
69

Постов
181

Баллов
546
  • 09, Jun 2024
  • #3
Почему вы не используете такой BB-код: Text [radio label="выбрать опцию" options="abc, xyz, fgh" требуется="нет"] Это будет намного проще анализировать как с помощью регулярного выражения, так и с помощью PHP.
 

Allgis


Рег
12 Oct, 2011

Тем
82

Постов
167

Баллов
597
  • 10, Jun 2024
  • #4
Спасибо за это. В итоге я разрешил флажкам и переключателям иметь вложенные поля и использовал для них <. Структура имени и идентификатора входных данных достаточно сложна, поэтому при их создании требуется многое, включая возможность репликации групп входных данных.

Разделение опций радио на отдельные элементы bbcode, возможно, было бы хорошо, но связывать их обратно вместе, особенно при копировании, могло быть беспорядочно.
 

Andrey70


Рег
30 Jun, 2014

Тем
60

Постов
203

Баллов
543
  • 14, Jun 2024
  • #5
Чтобы что-то вложить, вы можете попробовать использовать такой bb-код:

[радио метка="что-то" option="ABC" option="XYZ" option="fgh" требуется="нет"]

Теперь ваш первый preg_match вернет все, что находится внутри скобок,

и если это тип "радио",

затем выполните еще один preg_match, чтобы найти все «опции» внутри этого.

Я думаю, это может выглядеть так:

$string= ' это что-то Text

[radio label="radio button" option="ABC" option="FFF" требуется="нет"] и еще кое-что'; preg_match_all( '/\[(.*?)\]/is', $string, $match ); foreach($match[1] как $k){ if( substr( Trim($k), 0, 5 ) == 'радио' ){ preg_match_all( '/(option\=\")(.*?)(\")/is', $k, $options ); //список опций находится в $options[2] }//если заканчивается }//foreach заканчивается
 

Wmcoin


Рег
20 May, 2011

Тем
62

Постов
196

Баллов
526
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно