Написание REGEX для соответствия атрибутам src, height и width тега img - PullRequest
1 голос
/ 19 мая 2009

Я пытаюсь написать выражение регулярного выражения для соответствия атрибутам src, width и height в теге изображения. Ширина и высота не обязательны.

Я придумал следующее:

(?:<img.*)(?<=src=")(?<src>([\w\s://?=&.]*)?)?(?:.*)(?<height>(?<=height=")\d*)?(?:.*)(?<width>(?<=width=")(\d*)?)?

expresso показывает это соответствие только биту src для следующего фрагмента html

<img src="myimage.jpg" height="20" />
<img src="anotherImage.gif" width="30"/>

Я надеюсь, что я действительно близок, и кто-то здесь может указать на то, что я делаю неправильно, у меня есть ощущение, что это мой необязательный бит между символами (?:. *) Я пытался сделать это не жадным безуспешно Так какие-нибудь указатели?

Ответы [ 4 ]

9 голосов
/ 19 мая 2009

Использование регулярных выражений для извлечения значений из HTML всегда является ошибкой. Синтаксис HTML намного сложнее, чем может показаться на первый взгляд, и странице очень просто уловить даже очень сложное регулярное выражение.

Вместо этого используйте HTML Parser .

Этот вопрос задавался до и будет задан снова. Регулярные выражения кажутся хорошим выбором для этой проблемы, но это не так.

3 голосов
/ 19 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

1 голос
/ 19 мая 2009

У меня не было возможности проверить это, но, возможно, это сработает для вас (обратите внимание, что я не использовал именованные совпадения):

<img(?:(\s*(src|height|width)\s*=\s*"([^"]+)"\s*)+|[^>]+?)*>
1 голос
/ 19 мая 2009

В большинстве диалектов регулярных выражений .* является "жадным" и будет превосходить; вместо этого используйте .*?, чтобы сопоставить «как можно меньше».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...