[正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]
哈哈,繼 昨天的那個正則表達式?之后又寫了一個更長的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出來的哦,是我寫的程序產生的,代碼如下:)
public static string ReplaceSpace(string content)
{
string tag = @"(?:[\w-:]+)";
string attribute = @"(?:[\w-:]+)(?:=(?:[^\s\>\<]*|\""[\s\S]*?\""|\'[\s\S]*?\'))?";
string name = @"(?:[\w-:]+)";
string argument = @"(?:[\w-:]+|\""[\s\S]*?\""|\'[\s\S]*?\')";
string beginningTag = @"(?:\<" + tag + @"(?:\s+" +attribute + @")*\s*(?:/)?\>)";
string endingTag = @"(?:\</" + tag + @"\>)";
string xmlComment = @"(?:\<!--[\s\S]*?--\>)";
string xmlDirective = @"(?:\<!" +name + @"(?:\s+" +argument + @")*\s*\>)";
string xmlCData = @"(?:\<!\[CDATA\[(?:[\s\S]*?)\]\]\>)";
string styleBlock = @"(?:(?:\<(?:Style)(?:\s+" +attribute + @")*\s*(?:/)?\>)(?:[\s\S]*?)(?:\</(?:Style)\>))";
string scriptBlock = @"(?:(?:\<(?:script)(?:\s+" +attribute + @")*\s*(?:/)?\>)(?:[\s\S]*?)(?:\</(?:script)\>))";
string xmlLiteral = @"(?:(?:(?<blank>[ ]+)|[^ \<\>])+)";
string pattern = styleBlock + "|" + scriptBlock + "|" + xmlDirective + "|" + xmlComment + "|" + beginningTag + "|" + endingTag + "|" + xmlCData + "|" + xmlLiteral;
Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
MatchCollection mc = r.Matches(content);
StringBuilder sb = new StringBuilder(content.Length + 1024);
foreach (Match m in mc)
{
if (m.Groups["blank"].Captures.Count > 0)
{
sb.Append(m.Value.Replace(" ", " "));
}
else
{
sb.Append(m.Value);
}
}
return sb.ToString();
}
最后,再給個更長的(全長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
總結
以上是生活随笔為你收集整理的[正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10分钟搭建一个H5商城,支持微信支付和
- 下一篇: 2017年html5行业报告,云适配发布