文字列の末尾から <br> タグを削除する最良の方法は何ですか?
質問
私が取り組んでいる .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);
他のヒント
への小さな変更 ブデュークス コードはバックトラックしないので高速になるはずです。
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();
上記のコードは少し「スクラッチパッド」的ですが、これを切り取ってコンソール アプリケーションに貼り付けて実行すると、実際に機能します :=)
RegEx を使用するか、末尾の文字列がブレークかどうかを確認して削除することができます