Ответ 1
string matchString = Regex.Match(original_text, "<img.+?src=[\"'](.+?)[\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;
Я ищу регулярное выражение, чтобы изолировать значение src для img. (Я знаю, что это не лучший способ сделать это, но это то, что я должен сделать в этом случае)
У меня есть строка, которая содержит простой HTML-код, некоторый текст и изображение. Мне нужно получить значение атрибута src из этой строки. Мне удалось полностью изолировать весь тег до сих пор.
string matchString = Regex.Match(original_text, @"(<img([^>]+)>)").Value;
string matchString = Regex.Match(original_text, "<img.+?src=[\"'](.+?)[\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;
Я знаю, что вы говорите, что вам нужно использовать регулярное выражение, но, если возможно, я бы действительно дал этому проекту с открытым исходным кодом шанс: HtmlAgilityPack
Это действительно просто использовать, я только что открыл его, и это очень помогло мне, так как я занимался более тяжелым анализом html. Это в основном позволяет использовать XPATHS для получения ваших элементов.
Их примерная страница немного устарела, но API очень легко понять, и если вы немного знакомы с xpaths, вы теперь обходите ее вокруг
Код для вашего запроса будет выглядеть примерно так: (uncompiled code)
List<string> imgScrs = new List<string>();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);//or doc.Load(htmlFileStream)
var nodes = doc.DocumentNode.SelectNodes(@"//img[@src]"); s
foreach (var img in nodes)
{
HtmlAttribute att = img["src"];
imgScrs.Add(att.Value)
}
Я попробовал то, что предложил Франсиско Норьега, но похоже, что api для HtmlAgilityPack был изменен. Вот как я это решил:
List<string> images = new List<string>();
WebClient client = new WebClient();
string site = "http://www.mysite.com";
var htmlText = client.DownloadString(site);
var htmlDoc = new HtmlDocument()
{
OptionFixNestedTags = true,
OptionAutoCloseOnEnd = true
};
htmlDoc.LoadHtml(htmlText);
foreach (HtmlNode img in htmlDoc.DocumentNode.SelectNodes("//img"))
{
HtmlAttribute att = img.Attributes["src"];
images.Add(att.Value);
}
Регулярное выражение, которое вы хотите, должно быть в строках:
(<img.*?src="([^"])".*?>)
Надеюсь, что это поможет.
Это должно захватывать все теги img и только часть src независимо от того, где находится (до или после класса и т.д.) и поддерживает html/xhtml: D
<img.+?src="(.+?)".+?/?>
вы также можете использовать внешний вид, чтобы сделать это, не требуя вытащить группу
(?<=<img.*?src=")[^"]*
помните, чтобы избежать кавычек при необходимости
Это то, что я использую, чтобы получить теги из строк:
</? *img[^>]*>
Вот тот, который я использую:
<img.*?src\s*?=\s*?(?:(['"])(?<src>(?:(?!\1).)*)\1|(?<src>[^\s>]+))[^>]*?>
Хорошая часть состоит в том, что она соответствует любому из ниже:
<img src='test.jpg'>
<img src=test.jpg>
<img src="test.jpg">
И он также может соответствовать некоторым неожиданным сценариям, таким как дополнительные атрибуты, например:
<img src = "test.jpg" width="300">