求获取HTML元素属性的正则表达式

songjd 2012-04-24 03:42:11
求一个正则表达式,能够分析html标签的属性
属性出现的可能
<element id=值无引号 无值属性 class="值1 值2" style='bg:#d; w:2; '></element>
有哪位大神能够帮帮忙给一个么~
网上找了一个"([^\s=]+)=([^\s>]+)"但是这个是根据空格来截断的。遇到一个属性有好几个值就不行。没有值的空属性也不行。
...全文
519 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
songjd 2012-04-24
  • 打赏
  • 举报
回复

这个是采用2次分析的结果。单独没有值的属性还是无法获取
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
string input = @"<element id=值无引号 无值属性 class=""值1 值2"" style='bg:#d; w:2; '></element>";
Dictionary<string,string> dic = new Dictionary<string,stri……
[/Quote]
你看我的截图分析的那个form
你的截图里的第一个也是不对的
这个分析出来应该是
id 值无引号
无值属性
class 值1 值2
style bg:#d; w:2;
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复

string input = @"<element id=值无引号 无值属性 class=""值1 值2"" style='bg:#d; w:2; '></element>";
Dictionary<string,string> dic = new Dictionary<string,string>();
MatchCollection mc = Regex.Matches(input, @"([^\s=]+)=(['""\s]?)([^'""]+)\2(?=\s|$|>)");
foreach (Match m in mc)
{
dic.Add(m.Groups[1].Value, m.Groups[3].Value);
}
dic.ToList().ForEach(e => Response.Write(e.Key+"\t"+e.Value));//看看
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

可以的啊
C# code

string input = @"<element id=值无引号 无值属性 class=""值1 值2"" style='bg:#d; w:2; '></element>";
Dictionary<string,string> dic = new Dictionary<string,string>();
……

有问题……
[/Quote]

这不是你要的结果?
kalaco 2012-04-24
  • 打赏
  • 举报
回复
帮顶,积分怎么来的?
songjd 2012-04-24
  • 打赏
  • 举报
回复
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

可以的啊
C# code

string input = @"<element id=值无引号 无值属性 class=""值1 值2"" style='bg:#d; w:2; '></element>";
Dictionary<string,string> dic = new Dictionary<string,string>();
……
[/Quote]
有问题的。
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复
可以的啊

string input = @"<element id=值无引号 无值属性 class=""值1 值2"" style='bg:#d; w:2; '></element>";
Dictionary<string,string> dic = new Dictionary<string,string>();
MatchCollection mc = Regex.Matches(input, @"([^\s=]+)=(['""\s]?)([^'""]+)\2(?=\s|$|>)");
foreach (Match m in mc)
{
dic.Add(m.Groups[1].Value, m.Groups[3].Value);
}
dic.ToList().ForEach(e => Console.WriteLine(e.Key+"\t"+e.Value));
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

([^\s=]+)=(['"\s]?)([^'"]+)\2(?=\s|$|>)
[/Quote]
这个省去了2次判定。但是和2次判断一样。没有值的属性也无法获取
<a class='ca cb cc' tag name=abc></a>
这里的tag属性无法获得到。就差这个了
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
([^\s=]+)=("|')(.*?)("|')
[/Quote]
这个可以把有引号的属性都规范出来了。
然后我用空格匹配的那个正则重新匹配一遍这里去掉2集合里重复的部分,基本上可以取到了。
现在就还有一个单独不含值的属性没有获取到。就是没有=号匹配的属性。
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

([^\s=]+)=(['"\s]?)([^'"]+)\2(?=\s|$|>)
[/Quote]
学习了,看来学得不够
q107770540 2012-04-24
  • 打赏
  • 举报
回复
([^\s=]+)=(['"\s]?)([^'"]+)\2(?=\s|$|>)
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
[/Quote]
多谢,我试试
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

引用 2 楼 的回复:

引用 1 楼 的回复:

这个真不好写,
只要列出属性了
([^\s=]+)=(.*?)(?=id|class|style|>)

列属性应该不行,毕竟属性穷举不可能而且自定义属性无法包含。
能否根据2个大前提,
先将带有引号的属性过滤一遍。
然后再根据上面那个正则筛选出空格的,
判断第一个过滤出来的集合里面含……
[/Quote]
可以这样
([^\s=]+)=("|')(.*?)("|')
取1、3分组,然后在对3分组用空格匹配
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

引用 1 楼 的回复:

这个真不好写,
只要列出属性了
([^\s=]+)=(.*?)(?=id|class|style|>)

列属性应该不行,毕竟属性穷举不可能而且自定义属性无法包含。
能否根据2个大前提,
先将带有引号的属性过滤一遍。
然后再根据上面那个正则筛选出空格的,
判断第一个过滤出来的集合里面含有第二个过滤出来的某个属性名称则……
[/Quote]
不带引号的属性,遇到空格则默认为属性值结束了。这个情况下使用上面我提供那个是可以实现的。
现在的情况就是引号内多个值会被截断,所以能否先使用一个正则,是根据引号匹配属性的。然后再根据空格的来匹配,根据空格获得的集合肯定是大于根据引号的。所以判断是否以及通过第一种截取过了。过滤掉。
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

这个真不好写,
只要列出属性了
([^\s=]+)=(.*?)(?=id|class|style|>)

列属性应该不行,毕竟属性穷举不可能而且自定义属性无法包含。
能否根据2个大前提,
先将带有引号的属性过滤一遍。
然后再根据上面那个正则筛选出空格的,
判断第一个过滤出来的集合里面含有第二个过滤出来的某个属性名称则丢弃,否则将第二集合的值个加入到……
[/Quote]
不是有的也不带引号m嘛?
songjd 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

这个真不好写,
只要列出属性了
([^\s=]+)=(.*?)(?=id|class|style|>)
[/Quote]
列属性应该不行,毕竟属性穷举不可能而且自定义属性无法包含。
能否根据2个大前提,
先将带有引号的属性过滤一遍。
然后再根据上面那个正则筛选出空格的,
判断第一个过滤出来的集合里面含有第二个过滤出来的某个属性名称则丢弃,否则将第二集合的值个加入到第一个集合。
我正则不会,所以这个思路也没法测试
EnForGrass 2012-04-24
  • 打赏
  • 举报
回复
这个真不好写,
只要列出属性了
([^\s=]+)=(.*?)(?=id|class|style|>)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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