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

哈哈,继 昨天的那个正则表达式 之后又写了一个更长的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/Laser_Lu/archive/2005/04/21/142605.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值