ASP.NETを使用して、指定された文字列からHTMLタグを確実に削除するにはどうすればよいですか(つまり、正規表現を使用しません)。PHPのようなものを探していstrip_tags
ます。
例:
<ul><li>Hello</li></ul>
出力:
"こんにちは"
私は車輪を再発明しないように努めていますが、今のところ自分のニーズを満たすものを見つけていません。
ASP.NETを使用して、指定された文字列からHTMLタグを確実に削除するにはどうすればよいですか(つまり、正規表現を使用しません)。PHPのようなものを探していstrip_tags
ます。
<ul><li>Hello</li></ul>
"こんにちは"
私は車輪を再発明しないように努めていますが、今のところ自分のニーズを満たすものを見つけていません。
回答:
文字列からすべての HTMLタグを削除するだけの場合、これは正規表現でも確実に機能します。交換:
<[^>]*(>|$)
空の文字列で、グローバルに。後で文字列を正規化することを忘れないでください:
[\s\r\n]+
単一のスペースで、結果をトリミングします。オプションで、HTML文字エンティティを実際の文字に置き換えます。
注:
>
では属性値を使用できます。このソリューションは、そのような値に遭遇すると壊れたマークアップを返します。"e;
。私はそれをWebUtility.HtmlDecode
そのために組み合わせます(これはタグを削除しません)。それは書き換え可能性があるため、タグを除去した後、それを使用>
して<
。例えばWebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
今すぐHTMLAgilityPackをダウンロードしてください!;) リンクをダウンロード
これにより、HTMLを読み込んで解析できます。次に、DOMをナビゲートして、すべての属性の内部値を抽出できます。真剣に、それはあなたに最大で約10行のコードを必要とします。これは、世の中で最も優れた無料の.netライブラリの1つです。
ここにサンプルがあります:
string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlContents);
if (doc == null) return null;
string output = "";
foreach (var node in doc.DocumentNode.ChildNodes)
{
output += node.InnerText;
}
text()
ノードにクエリを実行して、コンテンツと文字列をトリミングすることもできます。スペースで結合します。IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
if (doc == null)
チェックですか?これは常に誤りです、そうではありませんか?
Regex.Replace(htmlText, "<.*?>", string.Empty);
RegexOptions.SingleLine
。
protected string StripHtml(string Txt)
{
return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}
Protected Function StripHtml(Txt as String) as String
Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function
私はこれをasp.netフォーラムに投稿しましたが、それでもまだ最も簡単な解決策の1つであるようです。私はそれが最速または最も効率的であることを保証しませんが、それはかなり信頼できます。.NETでは、HTML Webコントロールオブジェクト自体を使用できます。本当に必要なことは、DIVなどの一時的なHTMLオブジェクトに文字列を挿入し、組み込みの「InnerText」を使用して、タグに含まれていないすべてのテキストを取得することです。簡単なC#の例については、以下を参照してください。
System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;
HtmlAgilityPackを使用できない人のために、.NETs XMLリーダーはオプションです。これは適切にフォーマットされたHTMLでは失敗する可能性がありますが、常にregxを使用してキャッチをバックアップとして追加してください。これは高速ではありませんが、古い学校のデバッグのステップに良い機会を提供することに注意してください。
public static string RemoveHTMLTags(string content)
{
var cleaned = string.Empty;
try
{
StringBuilder textOnly = new StringBuilder();
using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Text)
textOnly.Append(reader.ReadContentAsString());
}
}
cleaned = textOnly.ToString();
}
catch
{
//A tag is probably not closed. fallback to regex string clean.
string textOnly = string.Empty;
Regex tagRemove = new Regex(@"<[^>]*(>|$)");
Regex compressSpaces = new Regex(@"[\s\r\n]+");
textOnly = tagRemove.Replace(content, string.Empty);
textOnly = compressSpaces.Replace(textOnly, " ");
cleaned = textOnly;
}
return cleaned;
}
Michael Tiptopのソリューションが機能しないことについて意見を交換している人のために、これを行う.Net4 +の方法を次に示します。
public static string StripTags(this string markup)
{
try
{
StringReader sr = new StringReader(markup);
XPathDocument doc;
using (XmlReader xr = XmlReader.Create(sr,
new XmlReaderSettings()
{
ConformanceLevel = ConformanceLevel.Fragment
// for multiple roots
}))
{
doc = new XPathDocument(xr);
}
return doc.CreateNavigator().Value; // .Value is similar to .InnerText of
// XmlDocument or JavaScript's innerText
}
catch
{
return string.Empty;
}
}
私はここで提案された正規表現ベースのソリューションを見てきましたが、それらは非常に些細な場合を除いて、私に自信を与えません。属性の山括弧は、壊れるのに必要なすべてのことであり、野生の不正なHTMLは言うまでもありません。そして、エンティティのようなものはどう&
ですか?HTMLをプレーンテキストに変換する場合は、エンティティもデコードする必要があります。
そこで、以下の方法を提案します。
HtmlAgilityPackを使用して、この拡張メソッドはHTMLフラグメントからすべてのHTMLタグを効率的に取り除きます。のようなHTMLエンティティもデコードします&
。内側のテキストアイテムのみを返し、各テキストアイテムの間に改行を入れます。
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
あなたは本当に深刻であれば、あなたも(特定のHTMLタグの内容を無視したいと思い<script>
、<style>
、<svg>
、<head>
、<object>
彼らはおそらく、我々は後にしている感覚で読めるコンテンツが含まれていないので、気になります!)。何をするかは、状況や行きたいところによって異なりますが、HtmlAgilityPackを使用すると、選択したタグをホワイトリストまたはブラックリストに登録することはかなり簡単になります。
コンテンツをHTMLページにレンダリングする場合は、XSSの脆弱性とその防止方法を必ず理解してください。つまり、HTMLページにレンダリングされるユーザー入力テキストを常にエンコードします(に>
なる>
など)。
2番目のパラメーター、つまりいくつかのタグを保持するには、HTMLagilityPackを使用して次のようなコードが必要になる場合があります。
public string StripTags(HtmlNode documentNode, IList keepTags)
{
var result = new StringBuilder();
foreach (var childNode in documentNode.ChildNodes)
{
if (childNode.Name.ToLower() == "#text")
{
result.Append(childNode.InnerText);
}
else
{
if (!keepTags.Contains(childNode.Name.ToLower()))
{
result.Append(StripTags(childNode, keepTags));
}
else
{
result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags)));
}
}
}
return result.ToString();
}
このページの詳細:http : //nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/
HtmlAgilityPackの代替であるAngleSharpを使用してこれを行うこともできます(そのHAPが悪いわけではありません)。HTMLソースからテキストを取り出すには、HAPよりも使いやすいです。
var parser = new HtmlParser();
var htmlDocument = parser.ParseDocument(source);
var text = htmlDocument.Body.Text();
あなたはを見てとることができ、キー特徴 HAPよりも「より良い」という時に、彼らはケースを作るのセクションを。ほとんどの場合、それはおそらく現在の質問には行き過ぎですが、それでも興味深い代替手段です。
単に使う string.StripHTML();