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]);
Вот функция, которую я записал для этой задачи:
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 сам закрывающие тэги.
Вы видите, что я заменяю теги колбасой, потому что я голоден, но Вы могли заменить их пустой строкой также, чтобы просто убрать их.
Это - хороший рабочий пример на фильтрации тега HTML:
Атрибуты являются основной проблемой с использованием regexes, чтобы попытаться работать с HTML. Рассмотрите чистое количество потенциальных атрибутов и то, что большинство из них является дополнительным, и также то, что они могут появиться в любом порядке и том, которое">" допустимый символ в заключенных в кавычки значениях атрибута. Когда Вы начнете пытаться принять все во внимание это, regex, необходимо было бы иметь дело со всем этим, быстро станет неуправляемым.
то, Что я сделал бы вместо этого, является использованием основанный на событии синтаксический анализатор HTML или тот, который дает Вам дерево DOM, которое можно обойти через.
Я просто заметил, что текущее решение позволяет теги, которые запускаются с любой из приемлемых тегов. Таким образом, если "b" является приемлемым тегом, "мигание" также. Не огромное соглашение, но что-то, чтобы рассмотреть, строги ли Вы о том, как Вы фильтруете HTML. Вы, конечно, не хотели бы позволять "s" как приемлемый тег, поскольку он позволит "сценарий".
Причина, что добавление границы слова \b не работало, состоит в том, что Вы не помещали его в предвидении. Таким образом \b будет предпринят после < где это будет всегда соответствовать если < запускает HTML-тэг.
Помещенный это в предвидении как это:
<(?!/?(i|b|h3|h4|a|img)\b)[^>]+>
Это также показывает, как можно поместить / перед списком тегов, а не с каждым тегом.
Я думаю, что первоначально намеревался сделать значения дополнительными, но не выполнял, поскольку я вижу, что добавил ?
после того, как равняется знаку и сгруппировал часть значения соответствия. Давайте добавим ?
после той группы (отмеченный с морковью) для создания его дополнительным в соответствии также. Я не в своем компиляторе прямо сейчас, но вижу, работает ли это:
@"</?(?(?=" + acceptable + @")notag|[a-z,A-Z,0-9]+)(?:\s[a-z,A-Z,0-9,\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>";
^