2009-06-29 4 views
2

Я использую следующее регулярное выражение, чтобы получить значение src первого тега img в документе HTML.Regex, чтобы получить значение src из тега img

string match = "src=(?:\"|\')?(?<imgSrc>[^>]*[^/].(?:jpg|png))(?:\"|\')?" 

Теперь он фиксирует общий атрибут src, который мне не нужен. Мне просто нужен url внутри атрибута src. Как это сделать?

ответ

6

Разберите свой HTML-код с чем-то еще.HTML is not regular, и поэтому регулярные выражения не подходят для его разбора.

Используйте HTML-парсер или синтаксический анализатор XML, если HTML является строгим. Это намного проще, чтобы получить значение атрибута SRC, используя XPath:

//img/@src 

XML синтаксический встроен в System.Xml namespace. Это невероятно мощно. HTML parsing немного сложнее, если HTML не является строгим, но есть множество библиотек, которые будут делать это за вас.

+2

он не ищет синтаксический анализ html, а просто извлекает значение из одного тега в html. Regexes превосходят такие вещи. –

+1

@eqbridges: Тот факт, что регулярное выражение, которое он придумал, настолько сложно, является признаком того, что это неправильный способ решения проблемы. Тогда есть тот факт, что он не соответствует всем возможным значениям атрибутов src (т.е. содержащим «или»). Не разбирайте HTML/XML таким образом! Просто не делайте этого! – Welbog

+1

@Welbog - если он только нужно вытащить значение img src, я с уважением не согласен. Использование анализатора HTML в такой задаче является излишним. Если ему нужно сделать что-то особенно сложное, то я с большей вероятностью соглашусь. –

1

Ваше регулярное выражение должно (по-английски) соответствовать любому символу после цитаты, это не цитата внутри тега атрибута src.

В Perl регулярное выражение, это было бы так:

/src=[\"\']([^\"\']+)/ 

URL-адрес будет $1 после запуска этого.

Конечно, это предполагает, что URL-адреса в ваших атрибутах src указаны. Вы можете изменить значения в скобках [] соответственно, если они не являются.

+0

Отлично работает для меня. Моим требованием было просто извлечь подстроку с использованием очень специфического шаблона. Тот факт, что исходная строка является HTML, не имеет значения. Я не пытаюсь разобрать HTML, и я согласен с вышеприведенным комментатором в том, что выталкивание полного парсера HTML для выполнения этой простой задачи является излишним. – djskinner

Смежные вопросы