asp.Net HTMLラベルをフィルタし、改行とスペースのみを保持

16238 ワード

自分でネット上からHTMLタグをフィルタリングする方法を探しましたが、私も誰がオリジナルなのか分かりません.どうせ多くは同じです.私はその方法をコピーしました.コードは以下の通りです.
///   <summary>

///     HTML  

///   </summary>

///   <param   name="NoHTML">  HTML      </param>

///   <returns>        </returns>

public static string NoHTML(string Htmlstring)

{

  //    

  Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "",

    RegexOptions.IgnoreCase);

  //  HTML

  Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "",

    RegexOptions.IgnoreCase);

  Htmlstring = Regex.Replace(Htmlstring, @"([\r
])[\s]+
", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase); Htmlstring.Replace("<", ""); Htmlstring.Replace(">", ""); Htmlstring.Replace("\r
", ""); Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim(); return Htmlstring; }

以上のコードはネット上から直接コピーされています.これは確かにすべてのHTMLラベルをフィルタリングすることができますが、これは私が望んでいるものではありません.これはフィルタリングがきれいすぎます.textarea入力ボックスを使うと、スペースを残して改行します.
それから私は自分でこの方法を変えて、textareaの改行は、だから私はこれらのラベルを再マッチングして
に置き換えなければなりません.そうすれば、データベースからページを読み取るときに、正しく改行することができて、スペースをHTMLのスペース記号に置き換えて、大きな成果をあげます.
       ///   <summary>

        ///     HTML  (  br \r
)( - )
/// </summary> /// <param name="NoHTML"> HTML </param> /// <returns> </returns> public static string NewNoHTML(string Htmlstring) { //Htmlstring.Replace("\\r\
", "%r%n").Replace("<br>","%br%").Replace("<br/>","%br&%").Replace("\
","%n");
// Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase); // HTML Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", " ", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase); Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase); Htmlstring.Replace("<", ""); Htmlstring.Replace(">", ""); //Htmlstring.Replace("\r
", "");
Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring); Htmlstring = Regex.Replace(Htmlstring, @"((\r
))
", "<br>"); Htmlstring = Regex.Replace(Htmlstring, @"(\r|
)
", "<br>"); Htmlstring = Regex.Replace(Htmlstring, @"(\s)", "&nbsp;"); return Htmlstring; }

このフィルタリングは,ユーザがパブリッシュコンテンツを入力する際のフィルタリングに用いることができるが,不足点があれば,指摘を批判してください.