2010-07-16 5 views
1

Это регулярное выражение возвращает только одно совпадение. (Я ищу, чтобы получить все изображения источников/местоположения (например, 'папке/image.png', содержащегося в атрибуте SRC в IMG тег HTML)Регулярное выражение возвращает только одно совпадение

Пример входной строки:.

input = @"<p>here is an image</p><img attr=""ahwer"" src=""~/Images/logo.png"" st=""abc""/><p>some more text here</p>"; 
      s += @"<p>test</p><img src=""a.jpg"" /><img src=""folder/image.png"" />" 

Pattern

pattern = @"<img.*src=""([^""]*)"".*/>"; 

Количество MatchCollection всегда 1 (как ни странно, только последний матч, в этом случае «папке/image.png». Всякий раз, когда я изменить шаблон просто «IMG», он находит все три метки изображения. Таким образом, вероятно, мой шаблон регулярного выражения неверен. Я не являюсь гуру regex и буду признателен за любую помощь.

+0

Проверьте, чтобы убедиться, что у вас есть необходимое количество двойных кавычек. Я не знаком с особым ароматом регулярного выражения .NET, но похоже, что у вас слишком много и в цели, и в шаблоне. – MikeD

+0

@MikeD: цитаты в порядке. Вот как вы избегаете кавычек в строковых литералах C#: удваивая их. –

ответ

2

Попробуйте pattern = @"<img.*?src=""([^""]*)"".*?/>"; - с помощью *.? матчи должны быть не жадными (т. е. не использовать все, что им нужно, до сопоставления с следующей частью).

+0

Вот оно. Теперь все три матча. Я подумал об этом всего за несколько секунд до того, как вы разместили его. Благодаря! – Gabe

3

Do not parse HTML using regular expressions.

Вместо этого, вы должны использовать HTML Agility Pack, например:

var doc = new HtmlDocument(); 
doc.Load(path); 
//Or 
doc.Parse(source); 

var paths = doc.DocumentElement.Descendants("img") 
           .Select(img => img.Attributes["src"].Value); 
+0

Спасибо за ссылку. Тем не менее, я не буду делать большие манипуляции с HTML, поэтому мне бы не пришлось использовать стороннюю библиотеку. – Gabe

0

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

Но на самом деле вам не следует пытаться использовать регулярное выражение для анализа HTML. Безумие лежит тот путь ...

0

Попробуйте рисунок на

pattern = @"(?<=.src="")[\w\/\.~]+"; 
Смежные вопросы