【问题标题】:Regular expression to remove <br> from <pre>从 <pre> 中删除 <br> 的正则表达式
【发布时间】:2011-03-29 07:42:37
【问题描述】:

我正在尝试删除出现在&lt;pre&gt;&lt;/pre&gt; 标签之间的&lt;br /&gt; 标签。我的字符串看起来像

string str = "Test<br/><pre><br/>Test<br/></pre><br/>Test<br/>---<br/>Test<br/><pre><br/>Test<br/></pre><br/>Test"

string temp = "`##`";
while (Regex.IsMatch(result, @"\<pre\>(.*?)\<br\>(.*?)\</pre\>", RegexOptions.IgnoreCase))
{
    result = System.Text.RegularExpressions.Regex.Replace(result, @"\<pre\>(.*?)\<br\>(.*?)\</pre\>", "<pre>$1" + temp + "$2</pre>", RegexOptions.IgnoreCase);
}
str = str.Replace(temp, System.Environment.NewLine);

但这会替换整个文本中第一个和最后一个&lt;pre&gt; 之间的所有br> 标签。因此我的最终结果是:

str = "Test<br/><pre>\r\nTest\r\n</pre>\r\nTest\r\n---\r\nTest\r\n<pre>\r\nTest\r\n</pre><br/>Test"

我希望我的结果是

str = "Test<br/><pre>\r\nTest\r\n</pre><br/>Test<br/>---<br/>Test<br/><pre>\r\nTest\r\n</pre><br/>Test"

【问题讨论】:

  • 字符串的格式是不是一直都是一样的,也就是有规律的吗?或者您是否试图从可能具有完全不同结构的整个 HTML 页面中获取此信息?
  • 正则表达式和 html 是不是好朋友的说法很多。它可能适用于一些有限的场景,但我个人会在这里使用解析器/DOM/任何东西。
  • 好的,所以如果我同意用正则表达式解析 html 不是一个好的选择。那么正则表达式是否只会解析第一个和最后一个&lt;pre&gt;标签之间的标签?
  • “\
    ”如何匹配“
    ”?

标签: c# html regex


【解决方案1】:

好的。所以我发现了我的代码的问题。问题是,Regex.IsMatch 只考虑了&lt;pre&gt; 的第一次出现和&lt;/pre&gt; 的最后一次出现。我想考虑单独使用一组 &lt;pre&gt; 进行替换。所以我将我的代码修改为

foreach (Match regExp in Regex.Matches(str, @"\<pre\>(.*?)\<br\>(.*?)\</pre\>", RegexOptions.IgnoreCase)) 
{
    matchFound = true;
    str = str.Replace(regExp.Value, regExp.Value.Replace("<br>", temp));
}

而且效果很好。不管怎样,谢谢大家的回复。

【讨论】:

    【解决方案2】:
            string input = "Test<br/><pre><br/>Test<br/></pre><br/>Test<br/>---<br/>Test<br/><pre><br/>Test<br/></pre><br/>Test";
            string pattern = @"<pre>(.*)<br/>(([^<][^/][^p][^r][^e][^>])*)</pre>";
            while (Regex.IsMatch(input, pattern))
            {
                input = Regex.Replace(input, pattern, "<pre>$1\r\n$2</pre>");
            }
    

    这可能会起作用,但您应该使用 html 敏捷包,这与 &lt;br&gt;&lt;br /&gt; 等不匹配。

    【讨论】:

      【解决方案3】:

      如果您要解析整个 HTML 页面,RegEx 不是一个好的选择 - 请参阅 here 了解原因。

      使用诸如HTML Agility Pack 之类的HTML 解析器来完成此类工作。它也适用于您发布的片段。

      【讨论】:

      • 我只是想解析我在str中提到的上述字符串。
      • 这不是问题的答案。那家伙要求正则表达式,仅此而已。
      【解决方案4】:

      不要使用正则表达式来做到这一点。

      “懒一点,使用 CPAN 并使用 HTML::Sanitizer。” -杰夫阿特伍德,Parsing Html The Cthulhu Way

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多