正则表达式从<pre></pre>删除<br/>

时间:2010-08-13 06:47:59

标签: c# html regex

我正在尝试删除<br />标记之间显示的<pre></pre>标记。我的字符串看起来像

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

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

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"

4 个答案:

答案 0 :(得分:3)

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

使用HTML解析器(例如HTML Agility Pack)进行此类工作。它也适用于您发布的片段。

答案 1 :(得分:2)

不要使用正则表达式来执行此操作。

“懒惰,使用CPAN并使用HTML :: Sanitizer。” -Jeff Atwood,Parsing Html The Cthulhu Way

答案 2 :(得分:0)

        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敏捷包,这与<br><br />等不匹配。

答案 3 :(得分:0)

确定。所以我发现了我的代码问题。问题是,Regex.IsMatch只考虑了<pre>的第一次出现以及</pre>的最后一次出现。我想考虑一组<pre>替换。所以我将代码修改为

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

它运作良好。无论如何,谢谢你的回复。