[正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]

ZT: http://www.cnblogs.com/Laser_Lu/archive/2005/04/21/142605.html

哈哈,继 昨天的那个正则表达式 之后又写了一个更长的Regular Expression,全长527,是用于查找出所有的XHTML/HTML的标记外面的所有空格,并将之转换为 的。 希望这个能够解决dudu提的一个cnblogs的bug:)即使不能解决问题也算是对System.Text.RegularExpression.Regex的一个练笔了:)

(?:(?:\<(?:Style)(?:\s+(?:[\w-]+)(?:=(?:[^\s\>\<]*|\"[\s\S]*?\"|\'[\s\S]*?\'))?)*\s*(?:/)?\>)(?:[\s\S]*?)(?:\</(?:Style)\>))|(?:(?:\<(?:script)(?:\s+(?:[\w-]+)(?:=(?:[^\s\>\<]*|\"[\s\S]*?\"|\'[\s\S]*?\'))?)*\s*(?:/)?\>)(?:[\s\S]*?)(?:\</(?:script)\>))|(?:\<!(?:[\w-]+)(?:\s+(?:[\w-]+|\"[\s\S]*?\"|\'[\s\S]*?\'))*\s*\>)|(?:\<!--[\s\S]*?--\>)|(?:\<(?:[\w-]+)(?:\s+(?:[\w-]+)(?:=(?:[^\s\>\<]*|\"[\s\S]*?\"|\'[\s\S]*?\'))?)*\s*(?:/)?\>)|(?:\</(?:[\w-]+)\>)|(?:\<!\[CDATA\[(?:[\s\S]*?)\]\]\>)|(?:(?:(?<blank>[ ]+)|[^ \<\>])+)

这个正则表达式虽然很长,但可不是我用手code出来的哦,是我写的程序产生的,代码如下:)
None.gif
None.gif
public static string ReplaceSpace(string content)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
string tag = @"(?:[\w-:]+)";
InBlock.gif
string attribute = @"(?:[\w-:]+)(?:=(?:[^\s\>\<]*|\""[\s\S]*?\""|\'[\s\S]*?\'))?";
InBlock.gif
string name = @"(?:[\w-:]+)";
InBlock.gif
string argument = @"(?:[\w-:]+|\""[\s\S]*?\""|\'[\s\S]*?\')";
InBlock.gif
InBlock.gif
string beginningTag = @"(?:\<" + tag + @"(?:\s+" +attribute + @")*\s*(?:/)?\>)";
InBlock.gif
string endingTag = @"(?:\</" + tag + @"\>)";
InBlock.gif
string xmlComment = @"(?:\<!--[\s\S]*?--\>)";
InBlock.gif
string xmlDirective = @"(?:\<!" +name + @"(?:\s+" +argument + @")*\s*\>)";
InBlock.gif
string xmlCData = @"(?:\<!\[CDATA\[(?:[\s\S]*?)\]\]\>)";
InBlock.gif
string styleBlock = @"(?:(?:\<(?:Style)(?:\s+" +attribute + @")*\s*(?:/)?\>)(?:[\s\S]*?)(?:\</(?:Style)\>))";
InBlock.gif
string scriptBlock = @"(?:(?:\<(?:script)(?:\s+" +attribute + @")*\s*(?:/)?\>)(?:[\s\S]*?)(?:\</(?:script)\>))";
InBlock.gif
string xmlLiteral = @"(?:(?:(?<blank>[ ]+)|[^ \<\>])+)";
InBlock.gif
InBlock.gif
string pattern = styleBlock + "|" + scriptBlock + "|" + xmlDirective + "|" + xmlComment + "|" + beginningTag + "|" + endingTag + "|" + xmlCData + "|" + xmlLiteral;
InBlock.gif
InBlock.gif Regex r
= new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
InBlock.gif
InBlock.gif MatchCollection mc
= r.Matches(content);
InBlock.gif
InBlock.gif StringBuilder sb
= new StringBuilder(content.Length + 1024);
InBlock.gif
foreach (Match m in mc)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if (m.Groups["blank"].Captures.Count > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif sb.Append(m.Value.Replace(
" ", "&nbsp;"));
ExpandedSubBlockEnd.gif }

InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif sb.Append(m.Value);
ExpandedSubBlockEnd.gif }

ExpandedSubBlockEnd.gif }

InBlock.gif
return sb.ToString();
ExpandedBlockEnd.gif }

None.gif



最后,再给个更长的(全长765)正则表达式,这个算是我写的最长的正则表达式了。其实上面给出的第一个Regex是下面这个的一个专用于捕获blank的简化版本。
虽 然长,但很有用,可以解析出整个XHTML/HTML页面的所有元素和结构来:)解析后的内容都分别保存在named groups中了,可以通过match.Groups["name"];来提取,比如match.Groups["tag"];match.Groups ["attribute"];match.Groups["Style_Block";match.Groups["XML_Comment"];等,感 兴趣的不妨试一试就知道了:)

(?#Copyright 2005, by Laser Lu.)(?<Style_Block>(?<begin>\<(?<tag>style)(?:\s+(?<attribute>[\w-:]+)(?:=(?<value>[^\s\>\<]*|\"[\s\S]*?\"|\'[\s\S]*?\'))?)*\s*(?:/)?\>)(?<body>[\s\S]*?)(?<end>\</\k<tag>\>))|(?<Script_Block>(?<begin>\<(?<tag>script)(?:\s+(?<attribute>[\w-:]+)(?:=(?<value>[^\s\>\<]*|\"[\s\S]*?\"|\'[\s\S]*?\'))?)*\s*(?:/)?\>)(?<body>[\s\S]*?)(?<end>\</\k<tag>\>))|(?<XML_Directive>\<!(?<name>[\w-:]+)(?:\s+(?<argument>[\w-:]+|\"[\s\S]*?\"|\'[\s\S]*?\'))*\s*\>)|(?<XML_Comment>\<!--[\s\S]*?--\>)|(?<Beginning_Tag>\<(?<tag>[\w-:]+)(?:\s+(?<attribute>[\w-:]+)(?:=(?<value>[^\s\>\<]*|\"[\s\S]*?\"|\'[\s\S]*?\'))?)*\s*(?:/)?\>)|(?<Ending_Tag>\</(?<tag>[\w-:]+)\>)|(?<XML_CDATA>\<!\[CDATA\[(?<data>[\s\S]*?)\]\]\>)|(?<XML_Literal>(?:(?<blank>[ ]+)|[^ \<\>])+)

关于以上的两个Regex的相关说明,应该说功能还是比较强大的了:
1。这两个正则表达式能够解析最好是HTML/XHTML格式,如果是其他格式的字符串,有可能会运行不正常;
2。支持识别的标记有:普通的HTML标记,<!--HTML注释-->,<!XML指令>,<![CDATA[ ... ]]>,标记或指令的标识符支持[a-zA-Z0-9_-:];
3。支持name=value和单独一个name的attribute,能够识别出""或''包括的属性值;
4。针对<style></style>和<script></script>标记包含的内容进行特殊处理,也就是所有的CSS和Script代码将原封不动的作为整体捕获。

转载于:https://www.cnblogs.com/junmorn/archive/2006/02/23/336552.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查看mq是否启动的命令,rocketmq查看命令

1.1. 控制台使用RocketMQ 提供有控制台及一系列控制台命令&#xff0c;用于管理员对主题&#xff0c;集群&#xff0c;broker 等信息的管理&#xff1b;登录控制台首先进入RocketMQ 工程&#xff0c;进入/RocketMQ/bin在该目录下有个mqadmin 脚本查看帮助在mqadmin 下可以查看有…

我用段子讲.NET之依赖注入(一)

我用段子讲.NET之依赖注入&#xff08;一&#xff09;1&#xff09;西城的某个人工湖畔&#xff0c;湖水清澈见底&#xff0c;湖畔柳树成荫。人工湖往北&#xff0c;坐落着两幢写字楼&#xff0c;水晶大厦靠近地铁站&#xff0c;由于为了与湖面天际线保持一致&#xff0c;楼层只…

教师节,老师们最大的愿望竟然是。。 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;视频源网络&#xff0c;侵权删&#xff09;发给最敬爱的老师们↓ ↓ ↓

计算几何题集

这段时间刷了一群计算几何题&#xff0c;呼&#xff01; 做计算几何时一定要保证自己做到以下两点&#xff1a; 1.下手之前保证自己已经考虑到每一个细节&#xff0c;每一步的作法都要非常清晰。 2.敲代码时必须非常冷静&#xff0c;必须保持头脑清醒&#xff0c;保证自己敲下来…

linux文件权限 705,Linux 文件权限 - osc_86eb7mly的个人空间 - OSCHINA - 中文开源技术交流社区...

文件权限Linux 中任何一个文件都具有 「用户、用户组与其他用户」三种权限&#xff0c;一个用户可属于多个用户组。所有用户的相关信息都记录在 /etc/passwd 文件中&#xff0c;密码记录在 /etc/shaodw 文件&#xff0c;用户组记录在 /etc/group 文件。root 用户权限最高&#…

在.NET中获取一台电脑名,IP地址及当前用户名

在.NET中获取一台电脑名&#xff0c;IP地址及当前用户名是非常简单&#xff0c;以下是我常用的几种方法,如果大家还有其他好的方法&#xff0c;可以回复一起整理&#xff1a; 1. 在ASP.NET中专用属性&#xff1a; 获取服务器电脑名&#xff1a;Page.Server.ManchineName 获取用…

.net core 嵌入 js(javascript)脚本引擎

漂亮的目录1、万能的脚本2、内部嵌入引擎方式3、调用NodeJs服务&#xff0c;与之通信方式结论1、万能的脚本折腾无止境&#xff0c;.net core 提供了更多的可能&#xff0c;今天我们就来看看脚本引擎。提起脚本&#xff0c;不得不说说Javascript——WEB互联网世界的一大半江山都…

linux文件目录的管理,Linux文件目录管理

1、目录与路径相对路径与绝对路径绝对路径&#xff1a;路径的写法『一定由根目录 / 写起』&#xff0c;例如&#xff1a;/usr/share/doc这个目录相对路径&#xff1a;路径的写法『不是由根目录/写起』&#xff0c;例如&#xff1a; /usr/share/doc 要到/usr/share/man/底下时&a…

用一个小球揭开地球的面纱,探索地球运转的秘密!

一个人一旦对某事物有了浓厚的兴趣&#xff0c;就会主动去求知、去探索、去实践&#xff0c;并在求知、探索、实践中产生愉快的情绪和体验。所以&#xff0c;古今中外的教育家无不重视兴趣在智力开发中的作用。小木之前推荐过一款AR地球仪&#xff0c;它是一个互动性强、内容丰…

Eclipse C++的配置问题launch failed binary not found

首先下载eclipse c 我的是64bit版本 安装好MinGW&#xff0c;并配置好环境变量&#xff0c;参考我的博客 http://www.cnblogs.com/fickleness/p/3273044.html 配置eclipse 选executable,选mingw gcc .按make toolchain(s) preferred.ok 配置好关闭eclipse 然后 1、安装minGW先 …

最早的一副对联

公元964年&#xff08;后蜀广政二十七年&#xff09;春节前夕&#xff0c;后蜀主孟昶突然下了一道命令&#xff0c;要群臣在“桃符板”&#xff08;画有神像的桃木板&#xff0c;旧时认为可以避邪&#xff09;上题写对 句&#xff0c;以试才华。可是&#xff0c;当群臣们把对句…

张善友: .NET社区运营 | 2021 中国开发者生态峰会

内容来源&#xff1a;2021 年 6 月 5 日&#xff0c;由 SegmentFault 思否主办的 2021 中国开发者生态峰会圆满落幕。会上&#xff0c; .NET基金会成员、资深.NET顾问和解决方案专家张善友发表了主题为《 .NET社区运营》的演讲&#xff0c;以社区工程师的角度分享了 .NET社区发…

linux创建目录目录文件,Linux创建目录和文件管理教程

有时候我们需要在一块物理网卡上配置多个IP地址&#xff0c;这时就可以用到“子接口”的概念&#xff0c;这篇文章使用CentOS演示如何针对某块物理网卡创建子接口(在一些参考资料中&#xff0c;“子接口”有时也被称作“IP别名”)。有关Linux网络配置的基础知识&#xff0c;接下…

到底要不要拯救地球?真·逻辑鬼才!| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅真逻辑鬼才↓ ↓ ↓

深入理解Magento-第十章-数据操作数据收集器

在我们开始介绍数据操作前&#xff0c;我们先介绍一个神兵利器—Varien Data Collections。在最早的时候我们写php通常用Array来做数据收集器&#xff0c;这个小东西可发挥了大作用&#xff0c;要知道如果你想在其他语言中实现Array有多么难过。例如c、c&#xff0b;&#xff0…

修正CS2.0中的日历头显示错误

其实和前面版本中是一样的&#xff0c;刚刚改了&#xff0c;又有点小闲&#xff0c;所以&#xff0c;把它贴出来&#xff01;在CommunityServer.Blogs.Controls.WeblogCalendar中&#xff0c;找到构造函数&#xff0c;加入如下代码&#xff1a;public WeblogCalendar() { strin…

从零实操基于WSL2 Docker部署Asp.Net Core项目

前言平日在公司里都是基于阿里Teambition中的飞流进行Docker部署Api项目或服务&#xff0c;已经习惯了那一套成熟的操作流程&#xff0c;开发和部署确实快捷方便&#xff0c;但是还没在自己的电脑上进行操作过&#xff0c;特别是Windows10开始已经有WSL、WSL2去年在笔记本上捣鼓…

linux启动xorg进程,Linux 黑话解释:Xorg,X11,Wayland,什么是显示服务器

原标题&#xff1a;Linux 黑话解释&#xff1a;Xorg&#xff0c;X11&#xff0c;Wayland&#xff0c;什么是显示服务器您是否想知道X Server&#xff0c;Xorg&#xff0c;X11&#xff0c;Wayland以及诸如此类的东西到底是什么&#xff1f;Wayland vs Xorg&#xff0c;哪个更好&…

有气质的人都在看什么?

全世界只有3.14 % 的人关注了青少年数学之旅王小波说&#xff1a;我活在世上&#xff0c;无非想要明白些道理&#xff0c;遇见些有趣的事&#xff0c;倘能如我所愿&#xff0c;我的一生就算成功。你的圈子将决定你的人生。每一位对事物都有着独特的态度让你成为一个有趣的人。今…

投影变换[转]

4. 投影变换 一个投影变换类似于选择一个透镜的焦距&#xff0c;它是三种变换中最复杂的一个。 4.1 视锥&#xff08;Viewing Frustum&#xff09; 4.2 什么是投影变换? 4.3 设置投影矩阵 4.4 一个“W-Friendly”投影矩阵 4.1 视锥视锥就是场景中的一个三维空间&#xff0c;…