【发布时间】:2011-04-07 19:09:45
【问题描述】:
如何使用 NSRegularExpression 删除 HTML 文件中的整个 head-tag。有人可以给我一个正则表达式吗?
提前致谢, Ph99Ph
【问题讨论】:
标签: iphone regex cocoa cocoa-touch ios
如何使用 NSRegularExpression 删除 HTML 文件中的整个 head-tag。有人可以给我一个正则表达式吗?
提前致谢, Ph99Ph
【问题讨论】:
标签: iphone regex cocoa cocoa-touch ios
没有! HTML 是一种类型 2 语言,因此 不能用正则表达式解析(类型 3)。
如有疑问请联系this wiki article。
很多人使用正则表达式来解析/编辑 HTML。这在简单的情况下效果很好,但完全容易出错。
话虽这么说:您应该使用此正则表达式获得相当可靠的结果:
<head>.+?</head>
这需要“。”也匹配换行符。如果没有,请使用:
<head>(?:.|\n|\r)+?</head>
再说一遍:这很容易出错,不要这样做。
您应该使用的是XML解析器,例如NSXMLParser。
【讨论】:
NSRegularExpression 不像 PHP/PERL/... 其中 regex 的定义类似于 /pattern/flags//pattern/template/flags。相反,您必须为其提供 NSRegularExpressionDotMatchesLineSeparators 位掩码选项。
<head>(?:.|\n|\r)+?<\/head>
/…/ 正则表达式文字(在这种情况下,您当然是对的)。
请参阅RegEx match open tags except XHTML self-contained tags 接受的答案。或自 Stack Overflow 开始以来每天发布的完全相同问题的任何版本。
简而言之,您无法使用正则表达式可靠地解析 HTML。由于 HTML 的复杂性,RegEx 还不够先进。
【讨论】:
使用这样的东西:
result = System.Text.RegularExpressions.Regex.Replace(result,
@"<( )*head([^>])*>", "<head>",
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
result = System.Text.RegularExpressions.Regex.Replace(result,
@"(<( )*(/)( )*head( )*>)", "</head>",
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
result = System.Text.RegularExpressions.Regex.Replace(result,
"(<head>).*(</head>)", " ",
System.Text.RegularExpressions.RegexOptions.IgnoreCase);
【讨论】: