【问题标题】:how can i remove an outer <p>...</p> from a string如何从字符串中删除外部 <p>...</p>
【发布时间】:2015-02-02 23:20:12
【问题描述】:

我想从数据库中查询一个字符串 (html) 并将其显示在网页上。问题是数据有一个

 <p> around the text (ending with </p>

我想在返回此数据的视图模型或控制器操作中去除此外部标记。在 C# 中执行此操作的最佳方法是什么?

【问题讨论】:

    标签: c# html asp.net-mvc


    【解决方案1】:

    对于您的需求可能有点过头了,但如果您想解析 HTML,您可以使用 HtmlAgilityPack - 通常比这里建议的大多数解决方案更干净,尽管它可能没有那么高效:

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml("<p> around the text (ending with </p>");
    string result = doc.DocumentNode.FirstChild.InnerHtml;
    

    【讨论】:

      【解决方案2】:

      如果您绝对确定字符串将始终具有该标签,则可以使用String.SubstringmyString.Substring(3, myString.Length-7) 左右。

      更可靠的方法是手动编写适当的测试代码或使用正则表达式,或者最终使用BrokenGlass's answer 建议的 HTML 解析器。

      更新:你可以使用正则表达式:

      String filteredString = Regex.Match(myString, "^<p>(.*)</p>").ToString();
      

      您可以在初始 ^ 之后添加 \s 以删除前导空格。此外,您可以检查 Match 的结果以查看字符串是否完全匹配 &lt;p&gt;...&lt;/p&gt; 模式。 This 也可能有帮助。

      【讨论】:

      • 让我想起了一个开发笑话:你有一个问题 -> 你认为'正则表达式' -> 现在你有两个问题 ;-)
      • C# 的 Substring() 不支持负长度吗?
      • @ThiefMaster:库类/函数在不同语言之间没有区别。长度必须 > 0。msdn.microsoft.com/en-us/library/aka44szs.aspx
      • @sinelaw:拜托,为什么你必须开始使用 RegEx? -1 到一个很好的答案......
      • KyleWpppd:我回答了这个问题,我没有给出(或打算给出)HTML 或其任何子集的一般解析方法。
      【解决方案3】:

      如果数据总是被&lt;p&gt; ... &lt;/p&gt;包围:

      string withoutParas = withParas.Substring(3, withParas.Length - 7);
      

      【讨论】:

      • 我认为应该是 7 而不是 6
      【解决方案4】:

      尝试使用字符串函数 Remove() 将 &lt;p&gt; 的 FirstIndex() 和长度为 3 的 &lt;/p&gt; 的最后一个索引传递给它

      【讨论】:

        【解决方案5】:

        如果您绝对保证您的字符串将始终符合&lt;p&gt;...&lt;/p&gt; 的模式,那么使用data.Substring(3, data.Length - 6) 的其他解决方案就足够了。但是,如果它有可能看起来完全不同,那么您真的需要使用 HTML 解析器。共识是HTML Agility Pack 是要走的路。

        【讨论】:

        • 真的不需要为这个简单的任务使用 HTML 解析器。如果他想要做的只是简单地删除前后的

          并且字符串 always 包含它,那么它就像子字符串一样简单。但是,如果他想要比我更喜欢我推荐的 HTML 解析器。他的问题很简单,那么答案应该尽可能长,如果他需要更多的东西,他可以要求。
        • @Alxandr: "

          ...

          ", "

          ..

          " 等等。是的,如果你是,你需要使用 HTML 解析器与 HTML 交互。
        • 如果您只是想删除开始和起始 p-tag,则不是。这一切都取决于系统的规则。如果这是一个系统,它强制每当您输入数据时,它都会被包装在

          中(出于某种或其他原因),那么使用 HTML 解析器删除那些数据就太过分了。但是,一旦您开始处理诸如删除脚本和非法标签之类的事情,我完全同意您的看法,但这不是他所要求的。
        • @Alxandr:要点;我的观点是你可以有不符合简单模式的有效段落标签。我已经编辑了我的答案;谢谢!
        • 是的,我明白了,但说你必须使用 HAP 仍然有点牵强,尽管我同意如果场景比这更困难,我也会使用它 :)
        【解决方案6】:
        s = s.Replace("<p>", String.Empty).Replace("</p>", String.Empty);
        

        【讨论】:

        • 也许我错了,但这不会替换&lt;p&gt;&lt;/p&gt;每个 实例,包括任何内部实例吗?
        • 我不想替换

          的每个实例,只替换外部实例

        • 如果源是 HTML,则

          不会出现在段落中。除非你的意思是你有多个段落。这对我来说并不完全清楚。

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 2014-10-19
        相关资源
        最近更新 更多