山かっこを含むすべてのHTMLタグをC#の正規表現で置換/削除するにはどうすればよいですか?誰かがコードを手伝ってくれませんか?
山かっこを含むすべてのHTMLタグをC#の正規表現で置換/削除するにはどうすればよいですか?誰かがコードを手伝ってくれませんか?
回答:
前述のように、XMLまたはHTMLドキュメントの処理には正規表現を使用しないでください。ネストされた構造を一般的な方法で表現する方法がないため、HTMLおよびXMLドキュメントではあまり機能しません。
以下を使用できます。
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
これはほとんどの場合に機能しますが、これが期待どおりに機能しない場合があります(たとえば、山括弧を含むCDATA)。
正解はそれではなく、HTML Agility Packを使用することです。
追加するように編集:
恥ずかしがらずにjesseによる以下のコメントを盗み、今回も質問に不適切に回答したことで非難されないようにするために、HTMLの最も不完全な、気まぐれなビットでも機能するHTML Agility Packを使用したシンプルで信頼できるスニペットを次に示します。
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());
HTMLを解析するために正規表現を使用する防御可能なケースはほとんどありません。HTMLは、従来とは異なる正規表現エンジンでさえ提供するのが非常に面倒なコンテキスト認識なしでは正しく解析できないためです。RegExを使用すると、途中で取得できますが、手動で確認する必要があります。
HTML Agility Packは、HTMLを単純な文脈自由文法として扱うことから生じる可能性のある異常を手動で修正する必要性を減らす堅牢なソリューションを提供できます。
正規表現を使用すると、たいていの場合、たいていの場合に必要なものが得られますが、非常に一般的なケースでは失敗します。HTML Agility Packよりも優れた/より速いパーサーを見つけることができる場合は、それを試してください。しかし、世界をより壊れたHTMLハッカーにさらさないでください。
質問は広範すぎて明確に答えることができません。Webページのような実際のHTMLドキュメントからすべてのタグを削除することについて話しているのですか?もしそうなら、あなたはする必要があります:
それは私の頭の上にあります-もっとあると確信しています。これをすべて完了すると、単語、文、段落がいくつかの場所で一緒に実行され、他の場所では役に立たない空白の大きなチャンクができます。
ただし、フラグメントのみを使用していて、すべてのタグを削除するだけで済むと仮定すると、次の正規表現を使用します。
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
独自の代替で単一引用符と二重引用符で囲まれた文字列を一致させることで、属性値の山括弧の問題に対処できます。ライアンの答えの正規表現のように、タグ内の属性名やその他のものと明示的に一致させる必要はないと思います。最初の選択肢はそのすべてを処理します。
これらの(?>...)
構成について疑問に思っている場合は、それらはアトミックグループです。これらは正規表現を少し効率的にしますが、より重要なことに、ランナウェイバックトラッキングを防止します。私はそれがここで問題になるとは本当に思っていませんが、私がそれを言わなければ、他の誰かがそうするでしょう。;-)
もちろん、この正規表現は完璧ではありませんが、おそらく必要になるほど優れているでしょう。
@JasonTrueは正解です。HTMLタグの削除は、正規表現を介して行うべきではありません。
HtmlAgilityPackを使用してHTMLタグを削除するのは非常に簡単です。
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
Jasonの応答をエコーしたいのですが、いくつかのHtmlを単純に解析してテキストコンテンツを引き出す必要がある場合があります。
私はリッチテキストエディターによって作成されたHtmlでこれを行う必要がありました。
この場合、一部のタグのコンテンツだけでなく、タグ自体も削除する必要がある場合があります。
私の場合、タグはこのミックスに投入されました。一部の人は、私の(ごくわずかに)単純ではない実装が有用な出発点であると考えるかもしれません。
/// <summary>
/// Removes all html tags from string and leaves only plain text
/// Removes content of <xml></xml> and <style></style> tags as aim to get text content not markup /meta data.
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string HtmlStrip(this string input)
{
input = Regex.Replace(input, "<style>(.|\n)*?</style>",string.Empty);
input = Regex.Replace(input, @"<xml>(.|\n)*?</xml>", string.Empty); // remove all <xml></xml> tags and anything inbetween.
return Regex.Replace(input, @"<(.|\n)*?>", string.Empty); // remove any tags but not there content "<p>bob<span> johnson</span></p>" becomes "bob johnson"
}
<xml>.*(?!</xml>)</xml>
を使用します。最初のものは、最初のタグ名のキャプチャされた代替と、負の先読みと最後のタグのそれへの後方参照によって結合することもできます。RegexOptions.SingleLine
<[^>]*>
次のURLで正規表現方法を試してください:http : //www.dotnetperls.com/remove-html-tags
/// <summary>
/// Remove HTML from string with Regex.
/// </summary>
public static string StripTagsRegex(string source)
{
return Regex.Replace(source, "<.*?>", string.Empty);
}
/// <summary>
/// Compiled regular expression for performance.
/// </summary>
static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);
/// <summary>
/// Remove HTML from string with compiled Regex.
/// </summary>
public static string StripTagsRegexCompiled(string source)
{
return _htmlRegex.Replace(source, string.Empty);
}
このメソッドを使用してタグを削除します。
public string From_To(string text, string from, string to)
{
if (text == null)
return null;
string pattern = @"" + from + ".*?" + to;
Regex rx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = rx.Matches(text);
return matches.Count <= 0 ? text : matches.Cast<Match>().Where(match => !string.IsNullOrEmpty(match.Value)).Aggregate(text, (current, match) => current.Replace(match.Value, ""));
}