2009-10-20 3 views
0

Когда я тестирую свой javascript на этом site, он ведет себя так, как я ожидал.Javascript RegExp всегда сбой

Однако, когда я пытаюсь проверить его на моей странице всегда проваливает испытание

function testName() { 
    if (new RegExp('^(?!^(\..+)?$)[^\x00-\x1f\\?*:^&!`[email protected]#$$+=<>\?\*;|/]+$').test("me")) { 
     alert("good"); 
    } 
    else { 
     alert("invalid characters"); 
    } return false;   
} 

Выражение должен проверить имя файла для ввода специальных символов, таких как ^&*!~ + = <> `и т.д. Am I что-то глупое?

+0

Пожалуйста продублировать эту проблему на общедоступном сайте или по HTTP: // jsbin.com Код кажется правильным. Я предполагаю, что это что-то другое, вне этого кода, что вызывает проблемы. – brianpeiris

ответ

0

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

if(/^[\w-.()\']+$/.test(this.form.mediaFile.value)) return true; 
else return false; 
1

Не желая разобрать ваш огромный уродливый RE, я могу увидеть одну из двух проблем:

  1. Ваш тест в обратном направлении. Вызов test() вернет false в ваш пример выше, что означает, что он не соответствует плохим символам в «me», поэтому вы получите предупреждение о недопустимых символах, которое находится назад.

  2. Ваш синтаксис для теста неверен. Попробуйте использовать регулярное выражение буквальных вместо:

    if (/^(?!^(\..+)?$)[^\x00-\x1f\\?*:^&!`[email protected]#$$+=<>\?\*;|/]+$/.test("me")) { 
    
+0

Извините, я должен был уточнить, что я сделал с этим моментом. Я изначально имел литерал регулярного выражения, но переместил его в RegExp, чтобы я мог убедиться, что это не недопустимое выражение. Также я думаю, что вы можете вернуться в тест, возвращая ложную часть, учитывая это выражение. –

+0

Да, мои альтернативы - либо, не оба. Я мог бы сказать вам, какой из них я хотел бы попробовать и выяснить, что это означает RE, но, как я уже сказал, я не хочу. :) –

6

Когда вы кладете регулярное выражение в строку (например, когда вы используете «новый RegEx()» вместо /.../ нотации), то строка имеет регулярное выражение изменить. Зачем? Потому что он будет анализироваться дважды, а не один раз: во-первых, как строка - это означает, что вся нормальная обработка обратной косой черты, которая происходит внутри строковых констант, будет иметь место, а во-вторых, как регулярное выражение.

1

Помимо отводящего вопроса, утверждение (касательно последующей вашей (?! группы) просто broken in IE (а не в оригинальной JavaScript спецификации). Они не должны использоваться на клиентском JavaScript. Вместо этого разбейте тесты в этом разделе на отдельные условия if.

(Если это имя файл тестер, вы не должны полагаться на него в целях безопасности, поскольку есть много сломанных конструкции не улавливает.)