3

我是正则表达式的新手。我试图找到没有边框的图像。所以结果应该是第二个 Image。下面是尝试使用正则表达式匹配的文本。

<IMG onerror="this.errored=true;" USEMAP="#Map-43" BORDER="0"/>
<IMG onerror="this.errored=true;" USEMAP="#Map-43" />
<IMG onerror="this.errored=true;" USEMAP="#Map-43" BORDER="0"/>    

我尝试了以下正则表达式,但没有奏效

<IMG\\s[^((>)&(?!BORDER)]*>

那么有人可以帮忙吗?

4

3 回答 3

4

您可以使用HtmlAgilityPack来解析 html

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var imgs = doc.DocumentNode.Descendants("img")
    .Where(n => n.Attributes["border"] == null)
    .ToList();

PS:另见:RegEx match open tags except XHTML self-contained tags

于 2012-10-05T07:11:46.807 回答
2

更好的选择是使用 html 解析器来解决此类问题。

但是您的主要正则表达式问题是您将前瞻放入字符类中,这样所有字符都被视为文字字符。

<IMG\s(?:(?!BORDER)[^>])*>

应该工作得更好。在 Regexr 上查看

但这只是为了解释您的正则表达式问题。要解决您的编程任务,请使用LB 答案

工作示例:

String html = "<IMG onerror=\"this.errored=true;\" USEMAP=\"#Map-43\" BORDER=\"0\"/><IMG onerror=\"this.errored=true;\" USEMAP=\"#Map-43\" /><IMG onerror=\"this.errored=true;\" USEMAP=\"#Map-43\" BORDER=\"0\"/>";
Console.WriteLine(Regex.Matches(html, @"<IMG\s(?:(?!BORDER)[^>])*>").Cast<Match>().ToList()[0]);
Console.ReadLine();
于 2012-10-05T07:12:26.353 回答
0

另一种方法是使用 jQuery 和 CSS 选择器在客户端获取“无边框属性”图像:

$img = $('img').not('[border]');

链接:

于 2012-10-05T08:19:38.250 回答