解析HTML正则表达式

 

//把所有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>[ ]+)|[^ /</>])+)

再给个更长的(全长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代码将原封不动的作为整体捕获。

 

//非htmt标记中的空格转换成“&nbsp;”

正则表达式代码如下:
              

public static string ReplaceSpace( string content)
{
string findstr = " (?<fore>(?:(?:[^< ])*(?:<(?:!--(?:(?:[^-])*(?:(?=-->)|-))*--|(?:[^>])+)>)?)*)[ ](?<back>(?:(?:[^< ])*(?:<(?:!--(?:(?:[^-])*(?:(?=-->)|-))*--|(?:[^>])+)>)?)*) " ;
string replacestr = " ${fore}&nbsp;${back} " ;
string targetstr = System.Text.RegularExpressions.Regex.Replace(content,findstr,replacestr,System.Text.RegularExpressions.RegexOptions.IgnoreCase);
return targetstr;
}


    这个正则表达式是一位朋友提供的,主要功能是将字符串中非htmt标记中的空格转换成“&nbsp;”, 目前我还没查出这个正则表达式中的问题,请熟悉正则表达式的朋友指点。

 

//获取URL

string regex="href=[///"///'](http://|//.///|///)?//w+(//.//w+)*(/w+(//.//w+)?)*(///|//?//w*=//w*(&//w*=//w*)*)?[///"///']";


preg_match_all('/<a.*?(?: |//t|//r|//n)?href=[/'"]?(.+?)[/'"]?(?:(?: |//t|//r|//n)+.*?)?>(.+?)<//a.*?>/sim', $strSource, $strResult, PREG_PATTERN_ORDER);

//PHP正则相关文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值