我正在尝试删除<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"
答案 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));
}
它运作良好。无论如何,谢谢你的回复。