PHP preg_match тройные скобки внутри двойных скобок - PullRequest
0 голосов
/ 16 марта 2019

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

Кто-то может мне помочь, пожалуйста?

{{prefix this is an {{{example}}} and can't stop on example word.}} {{anoter_prefix another double braces and I have to find both}}

REGEX:

'/\{\{prefix(.*)?\}\}/sU'

Редактировать:

Извините, я забыл сказать, что мне нужно разбить строки

Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 марта 2019

Если кто-то ищет что-то похожее на то, что мне нужно, Виктор дает нам путь.

'~(?<!{){{prefix(?:[^{}]|(?<!})}(?:}{2,})?|(?<!{){(?:{{2,})?)*}}(?!})~s'

Спасибо, ребята

0 голосов
/ 17 марта 2019

Вы можете использовать регулярное выражение, которое будет соответствовать {{ без {, затем совпадать с prefix, а затем совпадать с любым количеством символов, отличных от { и } или с одним { / } или 3 или более { с или } с, до подстроки }}, за которой не следует }:

'~(?<!{){{prefix(?:[^{}]|(?<!})}(?:}{2,})?|(?<!{){(?:{{2,})?)*(?<!})}}(?!})~'

См. Демоверсию regex

Детали

  • (?<!{) - отрицательный вид сзади, не требующий { непосредственно слева от текущего местоположения
  • {{prefix - буквальная подстрока
  • (?:[^{}]|(?<!})}(?:}{2,})?|(?<!{){(?:{{2,})?)* - ноль или более повторений:
    • [^{}] - любой символ, кроме { и }
    • | - или
    • (?<!})}(?:}{2,})? - } без предшествующего } и, необязательно, с 2 или более } символами
    • | - или
    • (?<!{){(?:{{2,})? - { без предшествующего { и, необязательно, с 2 или более { символами
  • (?<!}) - нет } допускается непосредственно слева от текущего местоположения
  • }} - подстрока }} ...
  • (?!}) - ... не сразу с }.
0 голосов
/ 16 марта 2019

Это простой вопрос страхования двойных скобок {{ - }}.

Затем введите это в рекурсию.

(?<!{){(?!{{)({(?:[^{}]++|(?1))*})}

https://regex101.com/r/lSEvCX/1

Форматированный код:

 (?<! { )               # Not a brace behind

 {                      # Open Brace ( 1st of double )
 (?! {{ )               # Tripple open not allowed
 (                      # (1 start), recursion function
      {                      # Open Brace ( 2nd of double )
      (?:
           [^{}]++                # Not braces, possesive
        |                       # or, 
           (?1)                   # Recurse a single open/close brace pair
      )*
      }                      # Close Brace ( closure)
 )                      # (1 end), recursion
 }                      # Close Brace 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...