Удалить несколько вхождений набора строк (массив) из начала и конца ввода - PullRequest
0 голосов
/ 02 октября 2018

Справочная информация: пользователи слишком часто добавляют дополнительные разрывы строк, которые могут варьироваться между тегами BR, P и DIV до конца (а иногда и до начала) их ввода с помощью редактора WYSIWYG.Мне нужно выполнить очистку, чтобы удалить любой тип разрыва строки из начала и конца ввода.

Вот пример ввода, который требует очистки:

<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 голосов
/ 02 октября 2018

Похоже, что самый простой и читаемый метод - пометить совпадение и использовать 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 - плохая практика, потому что это слишком примитивно и потенциально грязно.Я предполагаю, что в результате этого ответа дважды проголосовали.И все же ответ сработал, в то время как никто другой не дал рабочего решения.Большинство из вас, ребята, намного умнее, чем я, - об этом я точно знаю.

@ Нхан Фан предоставил более умное, рабочее решение.Молодец.

0 голосов
/ 02 октября 2018

Вы можете использовать флаг, чтобы убедиться, что в начале / конце ввода есть разрывные строки, и выполнять цикл, пока флаг не станет ложным:

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

Regard!

0 голосов
/ 02 октября 2018

Вот пример, он будет использовать массив для проверки каждого ввода путем циклического перемещения по массиву, а не наоборот.

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;
}
...