[英]Regular Expression to clear attributes from a html tag
我有一个非常简单的reg ex问题。 我的HTML标签如下所示:
<body lang=EN-US link=blue vlink=purple>
我想清除所有属性并只返回<body>
我想清除其属性的许多其他HTML标记,因此希望重用该解决方案。 如何使用正则表达式执行此操作? 谢谢,B。
像这样使用HtmlAgilityPack :
public string RemoveAllAttributesFromEveryNode(string html)
{
var htmlDocument = new HtmlAgilityPack.HtmlDocument();
htmlDocument.LoadHtml(html);
foreach (var eachNode in htmlDocument.DocumentNode.SelectNodes("//*"))
eachNode.Attributes.RemoveAll();
html = htmlDocument.DocumentNode.OuterHtml;
return html;
}
调用此方法传递要从中删除所有属性的html。
xpath可以帮助您很多。
不要对可能包含脚本的html文件使用正则表达式,例如在Javascript中,字符<
和>
不是标签定界符,而是运算符。 一个正则表达式可能会将这些运算符当作标记来匹配,这将完全弄乱文档。
不要使用正则表达式来解析HTML-这不是一个很好的工具 。 如果您无法控制HTML的传入格式,则尤其如此。
为此,请使用HTML Agility Pack 。
这是一个.NET代码库,可让您解析“网络外” HTML文件。 该解析器对“真实世界”格式的HTML十分宽容。 对象模型与提出System.Xml的对象模型非常相似,但用于HTML文档(或流)。
如果您的HTML并非没有希望地被破坏,并且属性不包含>
符号,那么它就很简单:
<body.+?>
...并且如果您要防止XSS或其他东西,请忽略此。
如果您的属性可能包含其他符号,那么这里是一个完整的示例:
string data = @"<body lang=""EN-US>"" link=blue vlink=purple>";
Regex re = new Regex(@"<(body).*?(""[^""]+""[^"">]+)*>");
Console.WriteLine(re.Replace(data, "<$1>")); // <body>
请注意,尽管如此,HTML仍需要格式正确。
通常,不建议使用正则表达式来解析html,但是如果您必须使用它,
对于您的问题,如下所示的方法将起作用。
在此正则表达式中,“ body”与“ span”进行“或”运算。 另请注意,注释将被忽略,因为它们可能会隐藏html。 出于相同的原因考虑脚本。
我将保留注释部分。您必须意识到,脚本可以更改文档的呈现方式,并使用可以隐藏您可能要处理的html的语言构造。 当然,正则表达式不应该这样做。
如果需要,可以删除'script'子表达式,以期修改可能包含您要更改的字符串常量的字符串。 虽然不推荐。
原始正则表达式(修饰符:已扩展,“点包括换行符”)
在C#中,可以命名正则表达式捕获的缓冲区,以便每个OR'd子表达式包含相同的名称。 示例: (?<begin> ..) .. (?<end> ..) | (?<begin> ..) .. (?<end> ..)
(?<begin> ..) .. (?<end> ..) | (?<begin> ..) .. (?<end> ..)
因此替换为[“ begin”] + [“ end”]。 这在Perl 5.10中有问题,因此我只使用捕获缓冲区号,Dot Net可能会正常工作。
搜索
# (1,2)
( <!--.*?--> ) ()
|
# (3,4)
(
(?:
<script
(?>
(?:\s+(?:".*?"|'.*?'|[^>]*?)+)?
\s*
>
)(?<!/> )
.*?
</script\s*>
|
</?script (?:\s+(?:".*?"|'.*?'|[^>]*?)+)? \s*/?>
)
) ()
|
# (5,6)
( <(?:body|span) ) (?!\s*/?>)
\s+ (?:".*?"|'.*?'|[^>]*?)+
( /?> )
更换
$1$2$3$4$5$6
以下正则表达式从给定字符串中的所有HTML / XML节点中清除属性。
\<[a-z]+\b([^>]+?)\s?\/?\>
作为C#函数,它看起来像这样:
public string RemoveAttributes(string value){
var attributeClean = new System.Text.RegularExpressions.Regex(@"\<[a-z]+\b([^>]+?)\s?\/?\>", System.Text.RegularExpressions.RegexOptions.Multiline | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
while (attributeClean.IsMatch(value)) {
var match = attributeClean.Match(value);
value = value.Remove(match.Index, match.Length);
}
return value;
}
如果只想清理特定元素,则可以使用以下正则表达式
\<(?:li|body)([^>]+?)\s?\/?\>
并将尽可能多的元素添加到由|
分隔的第一个不匹配组中 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.