私が取り組んでいる .NET Web システムでは、エンド ユーザーが HTML 形式のテキストを入力できる場合があります。これらの場所のいくつかでは、すべてのタグを残したいが、末尾の区切りタグはすべて取り除きます (ただし、テキストの本文内の区切りは残します)。
これを行う最善の方法は何ですか?(これを行う方法を考えることができますが、それらが最善ではないと確信しています。)
@ミッチが言ったように、
// using System.Text.RegularExpressions;
/// <summary>
/// Regular expression built for C# on: Thu, Sep 25, 2008, 02:01:36 PM
/// Using Expresso Version: 2.1.2150, http://www.ultrapico.com
///
/// A description of the regular expression:
///
/// Match expression but don't capture it. [\<br\s*/?\>], any number of repetitions
/// \<br\s*/?\>
/// <
/// br
/// Whitespace, any number of repetitions
/// /, zero or one repetitions
/// >
/// End of line or string
///
///
/// </summary>
public static Regex regex = new Regex(
@"(?:\<br\s*/?\>)*$",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
Small change to bdukes code, which should be faster as it doesn't backtrack.
public static Regex regex = new Regex(
@"(?:\<br[^>]*\>)*$",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
これも最善の方法ではないと確信していますが、末尾にスペースなどがない限り機能するはずです。
while (myHtmlString.EndsWith("<br>"))
{
myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}
元の質問のあいまいさを無視して、文字通り読んでみようと思います。TrimEnd をオーバーロードして文字列を取得する拡張メソッドを次に示します。
static class StringExtensions
{
public static string TrimEnd(this string s, string remove)
{
if (s.EndsWith(remove))
{
return s.Substring(0, s.Length - remove.Length);
}
return s;
}
}
これが機能することを示すためのいくつかのテストを次に示します。
Debug.Assert("abc".TrimEnd("<br>") == "abc");
Debug.Assert("abc<br>".TrimEnd("<br>") == "abc");
Debug.Assert("<br>abc".TrimEnd("<br>") == "<br>abc");
このソリューションは正規表現よりも読みやすく、おそらく正規表現よりも高速であり (パフォーマンスが心配な場合は、投機ではなくプロファイラーを使用する必要があります)、文字列の末尾から他のものを削除するのに役立つことを指摘したいと思います。
問題があなたが述べたよりも一般的な場合 (たとえば、末尾のスペースなどを削除<BR>
して処理する場合) は、正規表現がより適切になります。</BR>
正規表現を使用して、正規表現の一致が文字列の末尾に固定されるように設定されたテキストを検索して削除できます。
(マークアップが有効なツリーである可能性が高い場合) 次のようなものを試すこともできます。
string s = "<markup><div>Text</div><br /><br /></markup>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(s);
Console.WriteLine(doc.InnerXml);
XmlElement markup = doc["markup"];
int childCount = markup.ChildNodes.Count;
for (int i = childCount -1; i >= 0; i--)
{
if (markup.ChildNodes[i].Name.ToLower() == "br")
{
markup.RemoveChild(markup.ChildNodes[i]);
}
else
{
break;
}
}
Console.WriteLine("---");
Console.WriteLine(markup.InnerXml);
Console.ReadKey();
上記のコードは少し「スクラッチ パッド」ですが、コンソール アプリケーションにカット アンド ペーストして実行すると、機能します :=)
正規表現を使用するか、末尾の文字列が改行であるかどうかを確認して削除することができます