c#正则表达式匹配img src =“*”类型的URL

时间:2010-09-09 19:50:14

标签: c# regex url pattern-matching

我在c#中有一个正则表达式,我用来匹配图像标记并拉出URL。我的代码在大多数情况下都有效。下面的代码会将所有相对图片网址“修复”为绝对网址。

问题是正则表达式与以下内容不匹配:

<img height="150" width="202" alt="" src="../Image%20Files/Koala.jpg" style="border: 0px solid black; float: right;">

例如,它匹配这个就好了

<img height="147" width="197" alt="" src="../Handlers/SignatureImage.ashx?cid=5" style="border: 0px solid black;">

关于如何使其匹配的任何想法都会很棒。我认为问题是%,但我可能是错的。

Regex rxImages = new Regex(" src=\"([^\"]*)\"", RegexOptions.IgnoreCase & RegexOptions.IgnorePatternWhitespace);
mc = rxImages.Matches(html);
if (mc.Count > 0)
{
    Match m = mc[0];
    string relitiveURL = html.Substring(m.Index + 6, m.Length - 7);
    if (relitiveURL.Substring(0, 4) != "http")
    {
        Uri absoluteUri = new Uri(baseUri, relitiveURL);
        ret += html.Substring(0, m.Index + 5);
        ret += absoluteUri.ToString();
        ret += html.Substring(m.Index + m.Length - 1, html.Length - (m.Index + m.Length - 1));
        ret = convertToAbsolute(URL, ret);
    }
}

4 个答案:

答案 0 :(得分:3)

使用RegEx以这种方式解析图像是个坏主意。有关原因的详细说明,请参阅here

您可以使用HTML解析器(例如HTML Agility Pack)来解析HTML并使用XPath语法对其进行查询。

答案 1 :(得分:1)

首先,我会尝试跳过所有手动解析并使用linq to html

HDocument document = HDocument.Load("http://www.microsoft.com");

foreach (HElement element in document.Descendants("img"))
{
   Console.WriteLine("src = " + element.Attribute("src"));
}

如果这不起作用,那么我才会回到手动解析,我相信这里的一位优秀的温柔人士已经根据您的需要发布了正在运行的正则表达式。

答案 2 :(得分:0)

正则表达式是一个坏主意。更好地使用HTML解析器。这是一个正则表达式,我用于解析与正则表达式的链接:

String body = "..."; //body of the page
Matcher m = Pattern.compile("(?im)(?:(?:(?:href)|(?:src))[ ]*?=[ ]*?[\"'])(((?:http|https)(?::\\/{2}[\\w]+)(?:[\\/|\\.]?)(?:[^\\s\"]*))|((?:\\/{0,1}[\\w\\.]+)+))[\"']").matcher(body);
while(m.find()){
  String absolute = m.group(2);
  String relative = m.group(3);
}
但是,使用解析器会更容易,并且资源更好。这是一个链接,显示我切换到解析器时最终写的内容。

http://notetodogself.blogspot.com/2007/11/extract-links-using-htmlparser.html

可能没那么有用,因为那是java,你需要C#

答案 3 :(得分:0)

我不知道你的程序是做什么的,但我猜这是你在linux中从命令行在5分钟内完成的一个例子。您可以下载许多相同工具(例如sed)的Windows版本,并省去编写所有代码的麻烦。