Как я фильтрую все HTML-тэги кроме определенного белого списка?

    Array.prototype.moveUp = function (value, by) {
        var index = this.indexOf(value),
            newPos = index - (by || 1);

        if (index === -1)
            throw new Error("Element not found in array");

        if (newPos < 0)
            newPos = 0;

        this.splice(index, 1);
        this.splice(newPos, 0, value);
    };

    Array.prototype.moveDown = function (value, by) {
        var index = this.indexOf(value),
            newPos = index + (by || 1);

        if (index === -1)
            throw new Error("Element not found in array");

        if (newPos >= this.length)
            newPos = this.length;

        this.splice(index, 1);
        this.splice(newPos, 0, value);
    };



    var arr = ['banana', 'curyWurst', 'pc', 'remembaHaruMembaru'];

    alert('withiout changes= '+arr[0]+' ||| '+arr[1]+' ||| '+arr[2]+' ||| '+arr[3]);
    arr.moveDown(arr[2]);


    alert('third word moved down= '+arr[0] + ' ||| ' + arr[1] + ' ||| ' + arr[2] + ' ||| ' + arr[3]);
    arr.moveUp(arr[2]);
    alert('third word moved up= '+arr[0] + ' ||| ' + arr[1] + ' ||| ' + arr[2] + ' ||| ' + arr[3]);

http://plnkr.co/edit/JaiAaO7FQcdPGPY6G337?p=preview

35
задан richardtallent 23 July 2009 в 20:28
поделиться

6 ответов

Вот функция, которую я записал для этой задачи:

static string SanitizeHtml(string html)
{
    string acceptable = "script|link|title";
    string stringPattern = @"</?(?(?=" + acceptable + @")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>";
    return Regex.Replace(html, stringPattern, "sausage");
}

Редактирование: По некоторым причинам я отправил исправление на свой предыдущий ответ как отдельный ответ, таким образом, я консолидирую их здесь.

я объясню regex немного, потому что это немного длинно.

первая часть соответствует открытой скобке и 0 или 1 наклонной черте (в случае, если это - близкий тег).

Следующий Вы видите если тогда конструкция со взглядом вперед. (? (? =SomeTag) then|else) я проверяю, чтобы видеть, является ли следующая часть строки одним из приемлемых тегов. Вы видите, что я связываю строку regex с приемлемой переменной, которая является приемлемыми именами тега, разделенными verticle панелью так, чтобы любое из условий соответствовало. Если бы это - соответствие, Вы видите, что я вставляю слово "notag", потому что никакой тег не соответствовал бы этому и если приемлемо, что я хочу оставить его в покое. Иначе я еще иду дальше к часть, где я соответствую любому имени тега [a-z, A-Z, 0-9] +

Затем, я хочу соответствовать 0 или больше атрибутам, которые я принимаю, находятся в атрибуте формы = "значение". таким образом, теперь я группирую эту часть, представляющую атрибут, но я использую?: препятствовать тому, чтобы эта группа была получена для скорости: (?:\s [a-z, A-Z, 0-9,-] + =? (?: (["" ']?). ? \1?))

Здесь я начинаю с пробельного символа, который был бы между тегом и названиями атрибута, затем соответствовать названию атрибута: [a-z, A-Z, 0-9,-] +

следующий я соответствую, равняется знаку, и затем любой кавычке. Я группирую кавычку, таким образом, она будет получена, и я могу сделать обратную ссылку позже \1 для соответствия тому же типу кавычки. Промежуточный эти две кавычки, Вы видите, что я использую период для соответствия чему-нибудь, однако я использую ленивую версию *? вместо жадной версии * так, чтобы это только соответствовало до следующей кавычки, которая закончила бы это значение.

следующий мы помещаем * после закрытия групп с круглой скобкой так, чтобы это соответствовало нескольким attirbute/value комбинациям (или ни один). В последний раз мы соответствуем некоторому пробелу \s и 0 или 1 конечной наклонной черте в теге для стиля xml сам закрывающие тэги.

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

30
ответ дан Jason Kelley 27 November 2019 в 07:18
поделиться

Это - хороший рабочий пример на фильтрации тега HTML:

Санируют HTML

11
ответ дан sohtimsso1970 27 November 2019 в 07:18
поделиться

Атрибуты являются основной проблемой с использованием regexes, чтобы попытаться работать с HTML. Рассмотрите чистое количество потенциальных атрибутов и то, что большинство из них является дополнительным, и также то, что они могут появиться в любом порядке и том, которое">" допустимый символ в заключенных в кавычки значениях атрибута. Когда Вы начнете пытаться принять все во внимание это, regex, необходимо было бы иметь дело со всем этим, быстро станет неуправляемым.

то, Что я сделал бы вместо этого, является использованием основанный на событии синтаксический анализатор HTML или тот, который дает Вам дерево DOM, которое можно обойти через.

2
ответ дан Sherm Pendley 27 November 2019 в 07:18
поделиться

Я просто заметил, что текущее решение позволяет теги, которые запускаются с любой из приемлемых тегов. Таким образом, если "b" является приемлемым тегом, "мигание" также. Не огромное соглашение, но что-то, чтобы рассмотреть, строги ли Вы о том, как Вы фильтруете HTML. Вы, конечно, не хотели бы позволять "s" как приемлемый тег, поскольку он позволит "сценарий".

2
ответ дан richardtallent 27 November 2019 в 07:18
поделиться

Причина, что добавление границы слова \b не работало, состоит в том, что Вы не помещали его в предвидении. Таким образом \b будет предпринят после < где это будет всегда соответствовать если < запускает HTML-тэг.

Помещенный это в предвидении как это:

<(?!/?(i|b|h3|h4|a|img)\b)[^>]+>

Это также показывает, как можно поместить / перед списком тегов, а не с каждым тегом.

1
ответ дан Jan Goyvaerts 27 November 2019 в 07:18
поделиться

Я думаю, что первоначально намеревался сделать значения дополнительными, но не выполнял, поскольку я вижу, что добавил ? после того, как равняется знаку и сгруппировал часть значения соответствия. Давайте добавим ? после той группы (отмеченный с морковью) для создания его дополнительным в соответствии также. Я не в своем компиляторе прямо сейчас, но вижу, работает ли это:

@"</?(?(?=" + acceptable + @")notag|[a-z,A-Z,0-9]+)(?:\s[a-z,A-Z,0-9,\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>";
                                                                                             ^
0
ответ дан Jason Kelley 27 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: