【问题标题】:Detecting if HTML string contains visible text in C#检测 HTML 字符串是否包含 C# 中的可见文本
【发布时间】:2013-12-05 00:45:03
【问题描述】:

我正在寻找一种方法来检查包含 html 的字符串并确定它是否包含任何应该可见的文本,不包括空格。

基本上,如果在将其呈现为innerHTML<div> 时显示为可见文本,则任何内容都应视为可见。

例如

  • <div>hello</div> 是可见的,因为“hello”显示在浏览器中。
  • <div><p> <br/></div>  不可见。
  • <script>alert('asdf')</script> 不可见。
  • plain text 是可见的,尽管它不包含任何 html 标记。

有很多我不确定的情况(任何结果都可以接受):

  • <div style="display: none">this is tricky</div> 不可见,但由于 css 为问题增加了另一层复杂性,因此最好不要打扰它。
  • <script>document.write('What is this, I don't even-')</script> 应该不在这个问题的范围内。
  • <input value="Read this"> 是可见的,但我现在不关心表单元素,所以这还不如不可见。

我想决定这个服务器端并相应地处理这种情况。

在 C# 中是否有一种很好的方法来决定这一点?编写自己的解决方案似乎很乏味,我想知道是否有人已经这样做了(或类似的事情)。

编辑:

这个问题很难理解吗?我已经说过我想在服务器上做,而不是在浏览器环境中。 jQuery 和 jsfiddle 在这里没什么相关性。

【问题讨论】:

  • 您没有使用正确的工具来完成这项工作;这就是为什么这些问题看起来“很难”。如果您正在执行回发并需要检查某些服务器控件的长度,则对您拥有的任何元素使用 C# .Length 方法。最简单的方法是使用 jQuery 的 .html().length 然后回发由此产生的任何值,而不是回发整个控件。
  • 我真的不知道该说什么。为什么我要进行任何回发?我还没有发送任何客户端。这些字符串来自一个数据库,其中包含对 HTML 中某些内容的描述。有一些垃圾数据,描述应该是空的,但是string.IsNullOrEmpty()返回false,因为它包含html标签。
  • 您是否对Html Agility Pack 之类的库开放?
  • @lastr2d2 :当然可以。我目前正在查看stackoverflow.com/questions/13248789/…,这是一个类似的问题。
  • 参考stackoverflow.com/questions/6344771/… 之类的问题以及右侧的相关问题。我相信它一定会发挥作用

标签: c# .net asp.net-mvc


【解决方案1】:
  public static bool StripHTMLAndCheckVisible(string HTMLText)
    {
        if (string.IsNullOrEmpty(HTMLText))
            return false;
        else
        {
            Regex regJs=new Regex(@"(?s)<\s?script.*?(/\s?>|<\s?/\s?script\s?>)",RegexOptions.IgnoreCase);
            HTMLText = regJs.Replace(HTMLText, "");
            Regex reg = new Regex("<[^>]+>", RegexOptions.IgnoreCase);
            HTMLText = reg.Replace(HTMLText, "");
            return string.IsNullOrEmpty(HTMLText) ? false : true;
        }
    }

它会删除所有的 HTML,Javascript 标签,如果可见则返回 true,如果不可见则返回 false。 希望对您有所帮助。


编辑

我最终做的是:

public static bool CheckHTMLForText(string html)
{
    var stripped = StringHelpers.StripTagsWithContent(html, "script", "style");
    stripped = StringHelpers.StripTagsRegex(stripped);
    return string.IsNullOrWhiteSpace(stripped);
}

StringHelpers.StripTagsWithContent() 将给定标签连同其内容一起剥离到结束标签的末尾(如上例中的脚本标签),StringHelpers.StripTagsRegex() 从字符串中删除标签。

【讨论】:

  • 虽然我喜欢这个想法,并且我已经有一个方法可以做类似的事情,但这可能还不够,因为还有其他标签,如&lt;css&gt; 我需要准备,谁知道还有什么。目前,使用 html 敏捷包似乎更健壮,但这要快得多。我需要对此进行试验。如果这符合我的需要,您可能会获得接受:)
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2015-10-12
相关资源
最近更新 更多