Допустим, у нас есть строка: <img src="/a.jpg">
– как извлечь /a.jpg
?
Это, безусловно, неверно: #<img src="(.*)[^"]">#
Это должно работать
/<img\s+src="(.*?)"/
Это работает (попробуйте проверить здесь http://www.spaweditor.com/scripts/regex/index.php )
/".*[^"]/
/<img src="([^"]*)">/
работает.
Может быть, вы думаете в правильном направлении с помощью ^ " :
<img +src="([^"]+)">
#<img src="(.*)[^"]"># // original
Это было почти на правильном пути. Однако он сочетал два разных подхода.
(.*)
Слишком жадный. Вам нужно добавить ?
чтобы остановить его раньше. (.*?)
иначе он сбрасывает кавычки.
И тогда [^"]
был лишним. Однако вы могли бы использовать его как альтернативу неспецифическому .*
Просто вставьте его в фигурные скобки вместо этого. Преимущество состоит в том, чтобы никогда не случайно совпадать с кавычками. Вы можете сделать то же самое вместо пространство, чтобы сделать все регулярное выражение более устойчивым и оставить закрытие >
так что он также работает, когда присутствуют дополнительные атрибуты:
#<img[^>]+src="([^"]*)"#
Это один из немногих случаев, когда регулярные выражения приемлемы для использования. Если вы хотите совместить более сложный HTML-код, то предпочитаете правильный парсер (phpQuery или QueryPath упрощают его).
другие ответы будут работать, только если src является единственным атрибутом, который будет иметь тег img, и он всегда будет первым.
if (preg_match('/<img\s+(?:\w+="[^"]+"\s*)*?src="([^"]+)/', $input, $matches)) $src = $matches[1];