#php #regex #preg-match-all
#php #регулярное выражение #preg-match-all
Вопрос:
Я использую preg_match_all
для поиска URL-адреса в HTML-файле. URL-адрес всегда отображается в начале строки без начального пробела, вот так:
<A HREF="/link/to/here"><strong>Next</strong></A>
Я использовал это, чтобы соответствовать:
preg_match_all('|^<A HREF="(?<url>.*?)"><strong>Next</strong>|', $html, $url_matches);
Это не работало, пока я не удалил символ carat (^). Я думал, что карат соответствует началу строки. Почему это приводит к сбою моего сопоставления?
Комментарии:
1. Вы абсолютно уверены, что в начале вашей строки нет пробелов? Что произойдет, если вы запустите его через
trim()
, а затем отправите полученную обрезанную строку через свойpreg_match_all()
, в котором есть каретка?
Ответ №1:
Вы должны добавить m
модификатор:
preg_match_all('|^<A HREF="(?<url>.*?)"><strong>Next</strong>|m', $html, $url_matches);
тогда ^
совпадает в начале строки, иначе оно совпадало бы только в начале всей строки.
Дополнительная информация: http://php.net/manual/en/reference.pcre.pattern.modifiers.php
Ответ №2:
^
соответствует началу строки, а не началу строки. Используйте m
(«многострочный») модификатор: //m