preg_match_all не совпадает при использовании carat (^)

#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