Помогите с регуляркой

A5
На сайте с 11.05.2009
Offline
37
447

Есть строка

START START text1 END START text2 END END

как получить в результате

START text1 END

и

START text2 END

используя такую регулярку

preg_match_all('/START (.*?) END/', $text, $matches);

получаются результаты вида

START START text1 END

то есть нужно как то указать, что группа символов "START" не может встречаться в "(.*?)", либо то, что она может встречаться только один раз во всём результате (то есть в начале, как это и указано в паттерне)

Подскажите, пожалуйста, как это сделать

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1

а START только два раза может появляться? Если да, то просто впишите два их в регулярку и всё.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
D
На сайте с 16.04.2011
Offline
3
#2

Попробуй вот это /\sSTART{1} (.*?) END/

вот он пример http://regexr.com?2tla1

skAmZ
На сайте с 04.09.2009
Offline
122
#3

Если убрать изврат и перевести задачу в более классический вид (заменой "START " на "{" и "END" на "}"), то работать со строкой проще: "{ { text1 } { text2 } }"

Ваша регулярка: /({[^{}]*})/

P.S. скобочки поставил чисто ради единообразия.

P.P.S. а вообще строка напоминает изобретение своего JSON)

A5
На сайте с 11.05.2009
Offline
37
#4
а START только два раза может появляться? Если да, то просто впишите два их в регулярку и всё.

может и больше

Попробуй вот это /\sSTART{1} (.*?) END/
вот он пример http://regexr.com?2tla1

Тут все, скажем так, пляшет от того, что до START должен быть какой нибудь пробельный символ (\s). Но дело в том что строка может быть и такой

"START START START text11 END START text12 END END START text2 END END"

и результат будет некорректен

Если убрать изврат и перевести задачу в более классический вид (заменой "START " на "{" и "END" на "}"), то работать со строкой проще: "{ { text1 } { text2 } }"
Ваша регулярка: /({[^{}]*})/

в приципе то конечно можно, но весь текст который есть внутри придётся проверять на наличие таких же скобок и заменять/экранировать их в нём, потом после всех операций приводить его к первозданному виду. Так что хз где будет больший изврат ) .. Как бы вариант то рабочий, но я просто надеялся найти решение в одну строку..

>P.P.S. а вообще строка напоминает изобретение своего JSON)

Это что то вроде обработки вложенного списка.. Типа рекурсивно разбить всё дерево на ветви.. Пользоваться какими то библиотеками ради такой мелкой задачки не хочется..

вот такую мне подсказали на одном форуме

preg_match_all("/START(?!\s*START\s*)((?:.|\s)+?)END/", $text, $matches);

вроде всё как надо

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий