Задать вопрос
@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 ловит отлично, а вот ссылку захватывать ни в какую не хочет. Что я тут делаю не так? Всем спасибо!
  • Вопрос задан
  • 119 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 5
Adamos
@Adamos
Если ищешь что-то в кавычках, нужно использовать не \"(.*)\", а \"([^"]*)\"
Ответ написан
iMedved2009
@iMedved2009
Не люблю людей
@PavelMos
.*?
href\=\"(.*?)\".*title=\"(.*)\".*breadcrumbs__item-link

https://regex101.com/r/wDkzxW/1
Ответ написан
Комментировать
@dodo512
Тут классика жанра "catastrophic backtracking" аж 4 раза используется .* и флаг /s.
Когда сокращаете левую часть до title убираете один .* и pcre.backtrack_limit вам хватает.
Нужно ограничить поиск с помощью [^"]* и [^>]* или убрать флаг /s.

preg_match_all('!href="([^"]*)"[^>]*title="([^"]*)"[^>]*breadcrumbs__item-link!siU',$str,$matches))
Ответ написан
Комментировать
@maiskiykot Автор вопроса
Free coder
На самом деле нужно было выбросить siU
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы