【问题标题】:c# regular expression to match img src="*" type URLsc#正则表达式匹配img src="*"类型的URL
【发布时间】:2010-09-09 19:50:14
【问题描述】:

我在 c# 中有一个正则表达式,用于匹配图像标签并提取 URL。我的代码在大多数情况下都有效。下面的代码会将所有相对图像 URL “修复”为绝对 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);
    }
}

【问题讨论】:

    标签: c# regex url pattern-matching


    【解决方案1】:

    使用 RegEx 以这种方式解析图像是一个坏主意。请参阅 here 了解原因。

    您可以使用诸如HTML Agility Pack 之类的 HTML 解析器来解析 HTML 并使用 XPath 语法对其进行查询。

    【讨论】:

      【解决方案2】:

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

      HDocument document = HDocument.Load("http://www.microsoft.com");
      
      foreach (HElement element in document.Descendants("img"))
      {
         Console.WriteLine("src = " + element.Attribute("src"));
      }
      

      如果这不起作用,那么我才会回到手动解析,我相信这里的一位优秀的绅士已经发布了一个可以满足您需求的工作正则表达式。

      【讨论】:

      • 您知道 LINQ2 to HTML 与 HTML Agility Pack 在解析混乱布局方面的表现如何?
      • @Jim Brissom 好点,我实际上没有。我将添加文字以澄清。
      • @Lucas Heneks - 您链接到的页面声称它不是基于Linq2Xml,但喜欢它并且确实如此 处理格式错误的 HTML。
      【解决方案3】:

      正则表达式是个坏主意。最好使用 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#

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多