В сценарии удара, как я санирую ввод данных пользователем?

Положив ответ Томаша Зато, я согласен с тем, что простое повторение массивов является самым быстрым. Кроме того (как уже отмечали другие), функцию следует называть равной / равной, а не сравнивать. В свете этого я модифицировал функцию, чтобы обрабатывать массивы для сходства - т. Е. Они имеют одни и те же элементы, но не в порядке - для личного использования, и я думал, что я брошу его здесь для всеобщего обозрения.

Array.prototype.equals = function (array, strict) {
    if (!array)
        return false;

    if (arguments.length == 1)
        strict = true;

    if (this.length != array.length)
        return false;

    for (var i = 0; i < this.length; i++) {
        if (this[i] instanceof Array && array[i] instanceof Array) {
            if (!this[i].equals(array[i], strict))
                return false;
        }
        else if (strict && this[i] != array[i]) {
            return false;
        }
        else if (!strict) {
            return this.sort().equals(array.sort(), true);
        }
    }
    return true;
}

Эта функция принимает дополнительный параметр strict, который по умолчанию имеет значение true. Этот строгий параметр определяет, должны ли массивы быть полностью равными как по содержимому, так и по порядку этого содержимого или просто содержать одно и то же содержимое.

Пример:

var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 4, 3];  // Loosely equal to 1
var arr3 = [2, 2, 3, 4];  // Not equal to 1
var arr4 = [1, 2, 3, 4];  // Strictly equal to 1

arr1.equals(arr2);         // false
arr1.equals(arr2, false);  // true
arr1.equals(arr3);         // false
arr1.equals(arr3, false);  // false
arr1.equals(arr4);         // true
arr1.equals(arr4, false);  // true

I 've также написал быстрый jsfiddle с функцией и этим примером: http://jsfiddle.net/Roundaround/DLkxX/

43
задан Devin Reams 18 September 2008 в 13:56
поделиться

5 ответов

Как dj_segfault указывает, оболочка может сделать большую часть из этого для Вас. Похож необходимо будет возвратиться к чему-то внешнему для печатания строчными литерами строки, все же. Для этого у Вас есть много опций, как остроты жемчуга выше, и т.д., но я думаю, что TR является, вероятно, самым простым.

# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`

порядок здесь несколько важен. Мы хотим избавиться от подчеркиваний плюс пробелы замены с подчеркиваниями, таким образом, мы, несомненно, должны будем разделить подчеркивания сначала. Путем ожидания для передачи вещей TR до конца мы знаем, что имеем только алфавитно-цифровой и подчеркивания, и мы можем быть уверены, что у нас нет пробелов, таким образом, мы не должны волноваться о специальных символах, интерпретируемых оболочкой.

44
ответ дан Thomee 23 September 2019 в 12:45
поделиться

Быстрый и грязный:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

1
ответ дан Thomas 23 September 2019 в 12:45
поделиться

После небольшого количества оглядывания это кажется tr, действительно самый простой путь:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

бритва Оккама , я предполагаю.

0
ответ дан Devin Reams 23 September 2019 в 12:45
поделиться

Вы могли выполнить его через жемчуг.

export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

я использую подоболочку ksh-стиля здесь, я не полностью уверен, что она работает в ударе.

Это - хорошая вещь об оболочке, то, что можно использовать жемчуг, awk, sed, grep....

1
ответ дан Axeman 23 September 2019 в 12:45
поделиться

Bash может сделать это все на своем собственном, большое спасибо. При рассмотрении раздела страницы справочника на Расширение Параметра Вы будете видеть, что тот удар имеет встроенные замены, подстроку, обрезку, rtrim, и т.д.

Для устранения всех неалфавитно-цифровых символов, чтобы сделать

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

Это бритва Оккама. Никакая потребность запустить другой процесс.

34
ответ дан dj_segfault 23 September 2019 в 12:45
поделиться