Задать вопрос
@maiskiykot
Free coder

Почему не срабатывает регулярка?

Приветствую. Что-то сегодня день какой-то - понедельник, наверное. Пытаюсь разобрать строку, точнее набор строк типа:
<a href="/kontrolno-izmeritelnyie-priboryi" itemprop="item" title="Контрольно-измерительные приборы" class="breadcrumbs__item-link" data-v-71>

Создал для этого регулярку:
preg_match_all("!href=\"(.*)\".*title=\"(.*)\".*breadcrumbs__item-link!siU",$str,$matches))

Однако она собака не ловит ни Х. Если сокращаю левую часть до title, то title ловит отлично, а вот ссылку захватывать ни в какую не хочет. Что я тут делаю не так? Всем спасибо!
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Простой Комментировать
Ответ пользователя dodo512 К ответам на вопрос (5)
@dodo512
Тут классика жанра "catastrophic backtracking" аж 4 раза используется .* и флаг /s.
Когда сокращаете левую часть до title убираете один .* и pcre.backtrack_limit вам хватает.
Нужно ограничить поиск с помощью [^"]* и [^>]* или убрать флаг /s.

preg_match_all('!href="([^"]*)"[^>]*title="([^"]*)"[^>]*breadcrumbs__item-link!siU',$str,$matches))
Ответ написан
Комментировать