Regex не может ограничить диапазон поиска - PullRequest
2 голосов
/ 18 марта 2020

У меня следующая проблема:

У меня есть такой шаблон:

/(?<=template=")(.*?)(.*\/)/gm 

И такой текст:

template="test/widgets/glasgow.phtml"}}

Мое регулярное выражение должно искать путь перед моим файлом, мне нужно его обрезать, чтобы он в конце выглядел так:

   template="glasgow.phtml"}}

Это отлично работает, но проблема в том, что у меня иногда есть текст, который выглядит так :

block="core/template" template="test/widgets/getcallus.phtml"}}</p>

Это сокращает все до </.

Это сокращается:

test/widgets/getcallus.phtml"}}</

Вместо:

test/widgets/

Я пытался ограничить конец $, но он ничего не делает.

Я тестирую его на regexr.com

https://regexr.com/50hi2

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Вы можете использовать следующий шаблон:

template="\K[^"\/]*\/[^"\/]*\/

См. Демоверсию regex . В PHP вы можете избавиться от обратной косой черты, если указали другой разделитель регулярных выражений:

$regex = '~template="\K[^"/]*/[^"/]*/~';

Подробности

  • template=" - буквальный текст
  • \K - оператор сброса совпадений
  • [^"\/]* - 0 или более символов, отличных от / и "
  • \/ - / char
  • [^"\/]* - 0 или более символов, отличных от / и "
  • \/ - / char

Это равно до template="\K(?:[^"\/]*\/){2}, где (?:...){2} повторяет последовательность групп записи без захвата дважды.

0 голосов
/ 18 марта 2020

Будьте осторожны с (.*?)(.*\/)

Этот шаблон соответствует уязвимости REDOS. (Есть 2 ^ n способов прочитать n символов перед последним / ...

Чтобы сохранить регулярное выражение для вашего, вы можете использовать /(?<=template=")([^"]*?\/)*([^"]*)"/

([^"]*?\/)* читает как можно больше блоков "не / или " символов, а затем /".

https://regex101.com/r/SMSv5R/2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...