Регулярное выражение для извлечения атрибута src из тега img

Я пытаюсь написать шаблон для извлечения пути для файлов, найденных в тегах img в HTML.

String string = "<img src=\"file:/C:/Documents and Settings/elundqvist/My Documents/My Pictures/import dialog step 1.JPG\" border=\"0\" />";

My Pattern:

src\\s*=\\s*\"(.+)\"

Проблема в том, что мой паттерн также будет включать в себя 'border = "0" часть тега img.

Какой шаблон будет соответствовать пути URI для этого файла без включения 'border = "0"?

Ответ 1

Ваш шаблон должен быть (неэкранирован):

src\s*=\s*"(.+?)"

Важной частью является добавленный знак вопроса, который соответствует группе как можно меньше раз

Ответ 2

Попробуйте следующее выражение:

src\s*=\s*"([^"]+)"

Ответ 3

Этот только захватывает src только в том случае, если он находится внутри тега, а не когда он написан где-либо еще как обычный текст. Он также проверяет, добавили ли вы другие атрибуты до или после атрибута src.

Кроме того, он определяет, используете ли вы одиночные (') или двойные (") кавычки.

\<img.+src\=(?:\"|\')(.+?)(?:\"|\')(?:.+?)\>

Итак, для PHP вы бы сделали:

preg_match("/\<img.+src\=(?:\"|\')(.+?)(?:\"|\')(?:.+?)\>/", $string, $matches);
echo "$matches[1]";

для JavaScript, который вы бы сделали:

var match = text.match(/\<img.+src\=(?:\"|\')(.+?)(?:\"|\')(?:.+?)\>/)
alert(match[1]);

Надеюсь, это поможет.

Ответ 4

Я решил это с помощью этого регулярного выражения.

/<img.*?src="(.*?)"/g

Утверждено в https://regex101.com/r/aVBUOo/1

Ответ 5

Я пытаюсь написать шаблон для извлечения пути для файлов, найденных в тегах img в HTML.

Можем ли мы иметь автоответчик для "Не использовать регулярное выражение для синтаксического анализа [X] HTML"?

Проблема в том, что мой паттерн также будет включать в себя 'border = "0" часть тега img.

Не говоря уже о каком-либо времени 'src="' появляется в виде обычного текста!

Если вы заранее знаете точный формат HTML, который вы собираетесь разбирать (например, потому что вы его создали сами), вы можете с ним справиться. Но в противном случае регулярное выражение является совсем неправильным инструментом для работы.

Ответ 6

Вы хотите играть с жадной формой группового захвата. Что-то вроде

src\\s*=\\s*\"(.+)?\"

По умолчанию регулярное выражение будет пытаться как можно больше совместить

Ответ 7

Я хотел бы расширить эту тему, так как обычно атрибут src приходит без кавычек, поэтому регулярное выражение для использования цитируемого и некотируемого атрибута src:
src\s*=\s*"?(.+?)["|\s]