Регулярное выражение для соответствия URL тега img - PullRequest
1 голос
/ 10 марта 2009

Это регулярное выражение:

<IMG\s([^"'>]+|'[^']*'|"[^"]*")+>

кажется, что обрабатывается бесконечно, когда передается этот текст

<img src=http://www.blahblahblah.com/houses/Images/
    single_and_multi/roof/feb09/01_img_trrnjks_vol2009.jpg' />

Я бы ожидал - не найти совпадения (быстро) - потому что в тексте есть только одна одиночная кавычка. Я имел это случиться в C #, а также с помощью инструмента регулярных выражений Expresso. Если текст намного короче, он работает.

Ответы [ 5 ]

6 голосов
/ 10 марта 2009
<IMG\s([^"'>]+|'[^']*'|"[^"]*")+>

Вынимаем пару веток, начало и конец:

([^"'>]+)+

Сколько способов может соответствовать "привет"?

(hell)(o)
(hel)(lo)
(hel)(l)(o)
(he)(llo)
(he)(l)(lo)
(he)(l)(l)(o)
... and so on
1 голос
/ 10 марта 2009

Похоже на одну из ситуаций, когда движок регулярных выражений многократно возвращается. В статье «Освоение регулярных выражений» Фридля есть хороший материал на эту тему.

0 голосов
/ 10 марта 2009

Не могли бы вы опубликовать, что именно вы пытаетесь найти или извлечь? Вы хотите выяснить, на что указывает тег img? Это значительно увеличит шансы на то, чтобы дать лучший ответ.

0 голосов
/ 10 марта 2009

Я думаю, что это то, что вы пытались, я думаю, что причина вашего длительного бега, как упоминалось в другом месте, из-за чрезвычайного повторения, вызванного жадным захватом для не кавычек или> быть или с помощью строковых процессоров ( также используется жадное совпадение ["'>].

Кажется, это быстро выполняется с правильно отформатированными или неправильно отформатированными тегами.

<img(\s+((\w+)=(('[^']*?')|("[^"]*?"))))+? />
0 голосов
/ 10 марта 2009

Другие комментаторы упомянули сложность, являющуюся вероятной причиной проблемы с перфорированием. Я бы добавил, что если вы пытаетесь сопоставить что-то похожее на тег IMG, я думаю, вы хотите регулярное выражение, похожее на это:

<IMG(\s+[a-z]+=('[^']*'|"[^"]*"|[^\s'">]+))+>

Конечно, все еще существуют допустимые варианты HTML, которые не может поймать это регулярное выражение. Как закрывающий / (требуется в xhtml) или пробел перед закрывающей скобкой. И он пропустит некоторые недопустимые случаи, например, неподдерживаемые имена атрибутов.

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