我有一个相当简单的方法可以递归地删除开始/结束 html 标签
class Program
{
static void Main(string[] args)
{
string s = FixHtml("<div><p>this is a <strong>test</strong></p></div>");
Console.WriteLine(s);
}
private static string FixHtml(string s)
{
//Remove any outer <div>
if (s.ToLower().StartsWith("<div>"))
{
FixHtml(s.Substring(5, s.Length - 5));
}
else if (s.ToLower().StartsWith("<p>"))
{
FixHtml(s.Substring(3, s.Length - 3));
}
else if (s.ToLower().EndsWith("</div>"))
{
FixHtml(s.Substring(0, s.Length - 6));
}
else if (s.ToLower().EndsWith("</p>"))
{
FixHtml(s.Substring(0, s.Length - 4));
}
return s;
}
}
行为是它可以递归地删除 <div> & <p>
标签,但在“return s”语句上它撤消了所有工作,通过添加回添加标签!
有人知道为什么会这样吗?以及如何强制它返回我想要的值。即
this is a <strong>test</strong>
最佳答案
在 .NET 中,字符串是不可变的 - 因此您的方法实际上永远不会更改返回值。当您调用 s.ToLower().StartsWith("<div>")
你会得到一个具有预期差异的新字符串。 现有字符串 s 保持不变。
此外,您永远不会使用递归调用的返回值。
在我的脑海中,尝试这样的事情:
private static string FixHtml(string s)
{
if (s.ToLower().StartsWith("<div>"))
{
return FixHtml(s.Substring(5, s.Length - 5));
}
else if (s.ToLower().StartsWith("<p>"))
{
return FixHtml(s.Substring(3, s.Length - 3));
}
else if (s.ToLower().EndsWith("</div>"))
{
return FixHtml(s.Substring(0, s.Length - 6));
}
else if (s.ToLower().EndsWith("</p>"))
{
return FixHtml(s.Substring(0, s.Length - 4));
}
return s;
}
关于c# - C# 递归方法的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123381/