@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 ловит отлично, а вот ссылку захватывать ни в какую не хочет. Что я тут делаю не так? Всем спасибо!
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 6
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))
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
пишите регулярки вот так

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


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

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект