背景:用户经常会添加额外的换行符,这些符在BR,P和DIV标签之间通过所见即所得编辑器在输入的末尾(有时是开始)之间有所不同。我需要进行清理以从输入的开头和结尾删除任何类型的换行符。
以下是需要清洁的输入示例:
<div> </div><div> </div><p> </p><br />this is the input to keep<div> </div><br /><div> </div><p> </p><div> </div>
为清理起见,我创建了以下扩展程序,该扩展程序运行良好...不过,它按顺序循环遍历每个换行符。
public static string RemoveStartAndEndBreaks( this string input )
{
var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p> </p>", "<div></div>", "<div> </div>", "<div> </div>" };
foreach( var lb in lineBreaks )
{
while( input.StartsWith( lb ) )
{
input = input.Substring( lb.Length );
}
while( input.EndsWith( lb ) )
{
input = input.Substring( 0, input.Length - lb.Length );
}
}
return input;
}
所以问题是,只有所有换行符的出现顺序与数组中出现的顺序相同,它才会清理所有换行符。因此,使用上面的示例,结果输出为:
<p> </p><br />this is the input to keep<div> </div><br /><div> </div><p> </p>
请注意,它只会删除找到的第一个中断类型(出现在输入字符串的开头或结尾),而忽略其余的中断。
Q1。找到匹配项后,如何重新启动整个数组的循环?
Q2。是在每次找到匹配项时重新启动循环是唯一的选择,还是有一种更有效的方法来检查每个匹配项并将其从头到尾删除?
Q3。我错过了明显的东西吗?
请注意,输入是html,因此结果输出(可能)包含与字符串数组中所述相同的换行符,必须保留。
即我只是从输入的开头和结尾删除换行符。中间的人需要呆在那里。
答案 0 :(得分:1)
这里是一个示例,它将使用数组通过遍历数组而不是其他方式来检查每个输入。
public static string RemoveStartAndEndBreaks(this string input)
{
var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p> </p>", "<div></div>", "<div> </div>", "<div> </div>" };
for (int i = 0; i < lineBreaks.Length; i++)
{
if (input == lineBreaks[i])
{
//Do This
}
}
return input;
}
答案 1 :(得分:1)
您可以使用一个标志来确保输入的开始/结束处有换行符,并循环直到该标志为假:
public static string RemoveStartAndEndBreaks(string input)
{
var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p> </p>", "<div></div>", "<div> </div>", "<div> </div>" };
var isMatched = true;
while (isMatched)
{
foreach (var lb in lineBreaks)
{
if (input.StartsWith(lb))
{
input = input.Substring(lb.Length);
isMatched = true;
break;
}
if (input.EndsWith(lb))
{
input = input.Substring(0, input.Length - lb.Length);
isMatched = true;
break;
}
isMatched = false;
}
}
return input;
}
问候!
答案 2 :(得分:-1)
最简单易读的方法是标记一个匹配项,然后使用goto重新启动循环:
public static string RemoveStartAndEndBreaks( this string input )
{
var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p> </p>", "<div></div>", "<div> </div>", "<div> </div>" };
var match = false;
start:
foreach( var lb in lineBreaks )
{
match = false;
while( input.StartsWith( lb ) )
{
input = input.Substring( lb.Length );
match = true;
}
while( input.EndsWith( lb ) )
{
input = input.Substring( 0, input.Length - lb.Length );
match = true;
}
if (match) goto start;
}
return input;
}
可能不是最有效的,但是可以。
更新:因此,使用标签和goto是不好的做法,因为它太原始了,可能会造成混乱。因此,我假设这个答案被否决了两次。然而,答案是有效的,而没有其他人提供有效的解决方案。你们中的大多数人比我聪明得多-我确实知道很多。
@Nhan Phan提供了一个更智能,更有效的解决方案。干得好。