Почему это регулярное выражение не работает, хотя он действителен и отлично работает на тестовом коде - PullRequest
0 голосов
/ 30 мая 2011

Я уже разместил несколько постов здесь на SO, связанных с этим, но все же это еще один, который работает с тестовым кодом, а не с контролем валидатора регулярного выражения с clientScript Enabled я хочу, чтобы fileUpload был проверен на стороне клиента во время загрузки.

<asp:RegularExpressionValidator id="rgvFile" runat="server" font-bold="true" errormessage="Only pdf, txt, doc, docx, png, gif, jpeg, jpg, zip, rar files allowed"
cssclass="rgvfile" enableclientscript="true" display="Dynamic" controltovalidate="fileUpload"
validationexpression="(.pdf|.txt|.doc|.docx|.png|.gif|.jpeg|.jpg|.zip|.rar)$"
text="Only pdf, txt, doc, docx, png, gif, jpeg, jpg, zip, rar files allowed" tooltip="Only certain files allowed. Filename must be within 30 letters and cannot contains invalid characters"></asp:RegularExpressionValidator>

проверочное выражение выполняет проверку допустимых расширений файлов [забудьте о подделке расширений, где изменение расширений файлов и загрузка осуществляются.]. Я тестировал выше на regExHero, regexBudy все проверки файла. Я также проверил это, как показано ниже.

"domreference.pdf".match(/(.pdf|.txt|.doc|.docx|.png|.gif|.jpeg|.jpg|.zip|.rar)$/);

, который выдает [.pdf,.pdf], что правильно. Но при использовании внутри валидатора регулярных выражений он даже не проверяет правильные имена файлов.

Ответы [ 2 ]

3 голосов
/ 30 мая 2011

Во-первых, обратите внимание, что вы не избежали точек:

\.(pdf|txt|doc|docx|png|gif|jpeg|jpg|zip|rar)$
1 голос
/ 31 мая 2011

Это не работает, потому что сценарий, написанный Microsoft, не был кросс-браузерным, и они никогда не думали об этом.

function RegularExpressionValidatorEvaluateIsValid(val) {
    var value = ValidatorGetValue(val.controltovalidate);
    if (ValidatorTrim(value).length == 0)
        return true;
    var rx = new RegExp(val.validationexpression);
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
}

где `val = значение FileUpload ', которое отличается для каждого браузера. Следовательно, даже если будет найдено правильное совпадение, последний оператор return вернет false, потому что значение никогда не будет равно совпадению в этой ситуации

...