【问题标题】:What's the best way to remove <br> tags from the end of a string?从字符串末尾删除 <br> 标签的最佳方法是什么?
【发布时间】:2008-09-25 18:42:22
【问题描述】:

我正在开发的 .NET Web 系统允许最终用户在某些情况下输入 HTML 格式的文本。在其中一些地方,我们希望保留所有标签,但去掉任何尾随的中断标签(但在文本正文中留下任何中断。)

最好的方法是什么? (我可以想办法做到这一点,但我确信它们不是最好的。)

【问题讨论】:


  • 呢?尾随空间呢?请提供更多细节,而不是让我们猜测。

标签: .net asp.net xhtml string


【解决方案1】:

正如@Mitch所说,

//  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);

【讨论】:

    【解决方案2】:

    bdukes代码的小改动,应该会更快,因为它不会回溯。

    public static Regex regex = new Regex(
        @"(?:\<br[^>]*\>)*$",
        RegexOptions.IgnoreCase
        | RegexOptions.CultureInvariant
        | RegexOptions.IgnorePatternWhitespace
        | RegexOptions.Compiled
    );
    regex.Replace(text, string.Empty);
    

    【讨论】:

      【解决方案3】:

      我相信这也不是最好的方法,但它应该可以工作,除非你有尾随空格或其他东西。

      while (myHtmlString.EndsWith("<br>"))
      {
          myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
      }
      

      【讨论】:

      • 是的。所以它可能应该检查可能性


        但是,这仍然不是最优雅的解决方案。
      【解决方案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");
      

      我想指出,这个解决方案比正则表达式更容易阅读,可能比正则表达式更快(如果您担心性能,您应该使用分析器,而不是推测),并且对于从末端删除其他内容很有用字符串。

      如果您的问题比您说的更普遍(例如,如果您想删除 &lt;BR&gt;&lt;/BR&gt; 并处理尾随空格或其他问题,则正则表达式会更合适。

      【讨论】:

        【解决方案5】:

        您可以使用正则表达式查找并删除将正则表达式匹配设置为锚点在字符串末尾的文本。

        【讨论】:

          【解决方案6】:

          您也可以尝试(如果标记可能是有效的树)类似于:

          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();
          

          上面的代码有点“草稿”,但如果你将它剪切并粘贴到控制台应用程序中并运行它,它确实可以工作:=)

          【讨论】:

            【解决方案7】:

            您可以使用 RegEx 或检查尾随字符串是否为中断并将其删除

            【讨论】:

              猜你喜欢
              • 2023-04-07
              • 2019-09-05
              • 1970-01-01
              • 2014-03-29
              • 2011-05-22
              • 2011-10-03
              • 2023-01-11
              • 2011-05-31
              • 2016-08-11
              相关资源
              最近更新 更多