C# 获取 HTML元素 的 所有属性值的 正则 有点小问题,请指点下

flyso 2016-01-12 10:14:40
所用类:
public static Hashtable getAttrs(string HtmlElement)
{
Hashtable ht = new Hashtable();
MatchCollection mc = Regex.Matches(HtmlElement, @"([^\s=]+)=(['""\s]?)([^'""]+)\2(?=\s|$|>)");
foreach (Match m in mc)
{
ht[m.Groups[1].Value] = m.Groups[3].Value;
}
return ht;
}

代码如下:
string html ="<img src=\"/images/file/jinpai_20151110.jpg?v1\" border=0 width='1000' height=\"60\" alt=\"金牌视频域名拍卖\" sql=\"select * from tableX where id=11 \">";
string html2 ="<img src=\"/images/file/jinpai_20151110.jpg?v1\" border=0 width='1000' height=\"60\" alt=\"金牌视频域名拍卖\" sql=\"select * from tableX where id=‘11’ \">";

Hashtable ht = HTML.getAttrs(html); //使用HTML2结果就不正确了
foreach (DictionaryEntry d in ht)
{
Response.Write("key:" + d.Key + " Value:" + d.Value + "</br>");
}

html获得的结果是正确的:
key:border Value:0
key:src Value:/images/file/jinpai_20151110.jpg?v1
key:height Value:60
key:sql Value:select * from tableX where id=11
key:width Value:1000
key:alt Value:金牌视频域名拍卖
如果用HTML2就不行了
现在得到了错误结果为
key:id Value:11
key:border Value:0
key:src Value:/images/file/jinpai_20151110.jpg?v1
key:height Value:60
key:width Value:1000
key:alt Value:金牌视频域名拍卖
正确结果应该为
key:border Value:0
key:src Value:/images/file/jinpai_20151110.jpg?v1
key:height Value:60
key:sql Value:select * from tableX where id=’11‘
key:width Value:1000
key:alt Value:金牌视频域名拍卖
...全文
309 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Doson 2016-01-15
  • 打赏
  • 举报
回复
再给你提供一个终极版,单引号,双引号,无引号 都可以匹配成功

(?<name>[\S^=]+)\s*=\s*"(?<value>[^""]+)"|(?<name>[\S^=]+)\s*=\s*'(?<value>[^'']+)'|(?<name>\w+)=(?<value>[^"])(?=[\s])
Doson 2016-01-15
  • 打赏
  • 举报
回复

(?<name>[\S^=]+)\s*=\s*"(?<value>[^""]+)"|(?<name>[\S^=]+)\s*=\s*'(?<value>[^'']+)'
秋的红果实 2016-01-13
  • 打赏
  • 举报
回复
引用 2 楼 flyso 的回复:
[quote=引用 1 楼 starfd 的回复:]
@"([\S^=]+)\s*=\s*""([^""]+)"""
这个倒是成功了,但是 border=0 width='1000' 这两种情况,一种是没有引号,一种是只有单引号,这两种形式的Name和值都没有获取到 只获取到了4个属性[/quote]用或(|)运算符,把原式中“改为‘,或空白:原式|……
flyso 2016-01-13
  • 打赏
  • 举报
回复
引用 4 楼 From_TaiWan 的回复:
[quote=引用 2 楼 flyso 的回复:] [quote=引用 1 楼 starfd 的回复:]
@"([\S^=]+)\s*=\s*""([^""]+)"""
这个倒是成功了,但是 border=0 width='1000' 这两种情况,一种是没有引号,一种是只有单引号,这两种形式的Name和值都没有获取到 只获取到了4个属性[/quote]用或(|)运算符,把原式中“改为‘,或空白:原式|……[/quote] 能具体点吗,我对正则一窍不通。。
flyso 2016-01-12
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
@"([\S^=]+)\s*=\s*""([^""]+)"""
四个规则, 无引号,单引号,双引号,双引号里有单引号的情况(如果里面有单引号就不要分析出来保留原样如select * from tableX where id=’11‘ 这里就不能再搞个新属性叫id值为11)
flyso 2016-01-12
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
@"([\S^=]+)\s*=\s*""([^""]+)"""
这个倒是成功了,但是 border=0 width='1000' 这两种情况,一种是没有引号,一种是只有单引号,这两种形式的Name和值都没有获取到 只获取到了4个属性
  • 打赏
  • 举报
回复
@"([\S^=]+)\s*=\s*""([^""]+)"""

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧