从输入的开头和结尾删除多次出现的一组字符串(数组)

时间:2018-10-02 02:47:21

标签: c# html string while-loop substring

背景:用户经常会添加额外的换行符,这些符在BR,P和DIV标签之间通过所见即所得编辑器在输入的末尾(有时是开始)之间有所不同。我需要进行清理以从输入的开头和结尾删除任何类型的换行符。

以下是需要清洁的输入示例:

<div>&nbsp;</div><div>&nbsp;</div><p>&nbsp;</p><br />this is the input to keep<div>&nbsp;</div><br /><div>&nbsp;</div><p>&nbsp;</p><div>&nbsp;</div>

为清理起见,我创建了以下扩展程序,该扩展程序运行良好...不过,它按顺序循环遍历每个换行符。

public static string RemoveStartAndEndBreaks( this string input )
    {
        var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p>&nbsp;</p>", "<div></div>", "<div> </div>", "<div>&nbsp;</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>&nbsp;</p><br />this is the input to keep<div>&nbsp;</div><br /><div>&nbsp;</div><p>&nbsp;</p>

请注意,它只会删除找到的第一个中断类型(出现在输入字符串的开头或结尾),而忽略其余的中断。

Q1。找到匹配项后,如何重新启动整个数组的循环?

Q2。是在每次找到匹配项时重新启动循环是唯一的选择,还是有一种更有效的方法来检查每个匹配项并将其从头到尾删除?

Q3。我错过了明显的东西吗?

请注意,输入是html,因此结果输出(可能)包含与字符串数组中所述相同的换行符,必须保留。

即我只是从输入的开头和结尾删除换行符。中间的人需要呆在那里。

3 个答案:

答案 0 :(得分:1)

这里是一个示例,它将使用数组通过遍历数组而不是其他方式来检查每个输入。

public static string RemoveStartAndEndBreaks(this string input)
{
    var lineBreaks = new[] { "<br>", "<br/>", "<br />", "<p></p>", "<p> </p>", "<p>&nbsp;</p>", "<div></div>", "<div> </div>", "<div>&nbsp;</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>&nbsp;</p>", "<div></div>", "<div> </div>", "<div>&nbsp;</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>&nbsp;</p>", "<div></div>", "<div> </div>", "<div>&nbsp;</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提供了一个更智能,更有效的解决方案。干得好。