Соответствие либо http
, либо //
в начале строки может быть выполнено с ^(?:http|//)
т, что вам нужно добавить в начале. Чтобы убедиться, что URL заканчивается указанными вами расширениями, вам нужно добавить $
в конце.
Поскольку вы получаете строку URL из атрибута тега, используя $anchor->getAttribute("href")
, вам не нужно проверять внутренний текст URL, я предлагаю заменить [\w,=/:.-]+
на .*
, чтобы соответствовать любому тексту между ними.
Итак, вы можете использовать
$regex = '#^(?:http|//).*\.(?:jpe?g|png|gif)$#iu';
Подробности
^
- начало строки (?:http|//)
- http
или //
.*
- любые 0+ символов, кроме разрыва строки символов, как можно больше \.
- .
char (?:jpe?g|png|gif)
- jpeg
, jpg
, png
или gif
строки $
- конец строки.
Если вы хотите, чтобы он работал с текстом HTML, вам необходимо использовать
$regex = '#\bhref=(["\']?)((?:http|//)[^"\']*\.(?:jpe?g|png|gif))\1#iu';
if (preg_match_all($regex, $txt, $matches)) {
print_r($matches[2]);
}
См. regex demo .
Подробности
\b
- граница слова href=
- буквальный текст (["\']?)
- Группа 1: "
или '
, захваченные в Группе 1 ((?:http|//)[^"\']*\.(?:jpe?g|png|gif))
- Группа 2: * 10 70 * (?:http|//)
- http
или //
[^"\']*
- 0+ символов, отличных от '
и "
\.
- a .
(?:jpe?g|png|gif)
- строка расширения
\1
- то же значение, что и в группе 1, либо
"
или
'
, либо пусто.