@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 ловит отлично, а вот ссылку захватывать ни в какую не хочет. Что я тут делаю не так? Всем спасибо!
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 6
Adamos
@Adamos
Если ищешь что-то в кавычках, нужно использовать не \"(.*)\", а \"([^"]*)\"
Ответ написан
iMedved2009
@iMedved2009
Не люблю людей
(href|title)="([^"]+)"
https://regex101.com/r/EpfgZV/1
Ответ написан
@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))
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
пишите регулярки вот так

preg_match('~' . preg_quote($text, '/') . '~u');
// u - флажок для поддержки русского-арабского-китайского юникода


Не все регулярки нужно писать так, но это позволяет меньше переживать за спецсимволы.

Кроме того ваша задача предполагает парсинг html, лучше распакуйте simple_html_dom_1_9_1 и парсите им, он местами тащит то, что другие не тащат.
Ответ написан
@maiskiykot Автор вопроса
Free coder
На самом деле нужно было выбросить siU
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы