Регулярное выражение, возвращающее только одно совпадение - PullRequest
1 голос
/ 17 июля 2010

Это регулярное выражение возвращает только одно совпадение.(Я ищу, чтобы извлечь все источники / местоположения изображений (например, «folder / image.png», содержащийся в атрибуте src в теге html img).

Пример строки ввода:

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 (как ни странно, только последнее совпадение, в данном случае 'folder / image.png'. Всякий раз, когда я меняю шаблон на просто 'img', оннаходит все три тега изображения. Поэтому, скорее всего, мой шаблон регулярных выражений неверен. Я не являюсь гуру регулярных выражений и буду признателен за любую помощь.

Ответы [ 4 ]

3 голосов
/ 17 июля 2010

Не разбирать HTML с помощью регулярных выражений .

Вместо этого вы должны использовать 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);
2 голосов
/ 17 июля 2010

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

0 голосов
/ 17 июля 2010

Попробуйте шаблон

pattern = @"(?<=.src="")[\w\/\.~]+";
0 голосов
/ 17 июля 2010

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

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

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