我是正则表达式的新手。我正在尝试找到没有BORDER的图像。所以结果应该是第二个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)]*>
那么有人可以帮忙吗?
答案 0 :(得分: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
答案 1 :(得分:2)
更好的选择是使用html解析器来解决这个问题。
但是你的主要正则表达式问题是你把你的预测放到一个字符类中,这样所有字符都被视为文字字符。
<IMG\s(?:(?!BORDER)[^>])*>
应该更好。 See it on Regexr
但那仅仅是为了解释你的正则表达式问题。要解决您的编程任务,请使用L.B answer。
工作示例:
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();
答案 2 :(得分:0)
另一种方法是使用jQuery和CSS选择器获取客户端的“无边框属性”图像:
$img = $('img').not('[border]');
链接: