php – Извлечение из двух строк с использованием регулярного выражения

Допустим, у нас есть строка: <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];