非常に単純な正規表現の質問があります。私の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はこれで大いに役立ちます。
Javascriptのように、スクリプトを含む可能性のあるhtmlファイルに正規表現を使用しないでください。文字はタグ区切り文字<
で>
はなく演算子です。正規表現はおそらくこれらの演算子をタグであるかのように一致させ、ドキュメントを完全に台無しにします。
HTMLを解析するために正規表現を使用しないでください-これには適したツールではありません。これは、HTMLの受信形式を制御できない場合に特に当てはまります。
代わりに、 HTMLAgilityPackを使用してください。
これは、「Web外」のHTMLファイルを解析できるようにする.NETコードライブラリです。パーサーは、「現実世界」の不正な形式の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」とORされています。また、コメントはhtmlを非表示にする可能性があるため、無視されることに注意してください。同じ理由でスクリプトが考慮されます。
コメントセクションはそのままにしておきます。スクリプトによってドキュメントのレンダリングが変更され、処理する可能性のあるhtmlを非表示にできる言語構造が使用される可能性があることに注意する必要があります。もちろん、それは正規表現で行うべきではありません。
必要に応じて、変更したいものを含む可能な文字列定数を変更することを期待して、「script」部分式を削除できます。ただし、お勧めしません。
生の正規表現(修飾子:展開、「ドットには改行が含まれます」)
C#では、正規表現でキャプチャされたバッファーに名前を付けて、ORされた各部分式に同じ名前を含めることができます。例: (?<begin> ..) .. (?<end> ..) | (?<begin> ..) .. (?<end> ..)
置換が["begin"]+["end"]になるようにします。これはPerl5.10のバグであるため、キャプチャバッファ番号を使用するだけで、DotNetが正しく機能する可能性があります。
探す
# (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?\/?\>
そして、。で区切られた最初の一致しないグループにできるだけ多くの要素を追加し|
ます。