Регулярные выражения: различия между браузерами - PullRequest
1 голос
/ 08 ноября 2008

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

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$

Это работает в Internet Explorer и Google Chrome, но НЕ работает в Firefox. Тест всегда не проходит, даже для реального PDF. Поэтому я решил, что дополнительный материал не имеет значения, и упростил его до:

^.+\.pdf$

и теперь он отлично работает в Firefox, а также продолжает работать в IE и Chrome.
Это особенность элементов управления asp: FileUpload и RegularExpressionValidator в ASP.NET или это просто из-за того, что разные браузеры поддерживают регулярное выражение по-разному? В любом случае, с какими из последних вы столкнулись?

Ответы [ 6 ]

4 голосов
/ 08 ноября 2008

Относительно фактического вопроса: исходное регулярное выражение требует, чтобы значение начиналось с буквы диска или имени устройства UNC. Вполне возможно, что Firefox просто не включает это в имя файла. Также обратите внимание, что если у вас есть намерение стать кроссплатформенным, это регулярное выражение не будет работать в любой системе, отличной от Windows, независимо от браузера, поскольку они не используют буквы дисков или пути UNC. Ваше упрощенное регулярное выражение («принять что угодно, если оно заканчивается на .pdf») примерно так же хорошо, как и проверка имени файла.

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

(Я понимаю, что вы, возможно, знаете о необходимости дополнительной проверки, но следующий человек, который сталкивается с подобной ситуацией и находит ваш вопрос, не может.)

3 голосов
/ 08 ноября 2008

Насколько я знаю, Firefox не позволяет вам указать полный путь загрузки. Интерпретация регулярных выражений в данном случае кажется неактуальной. Я еще не видел какой-либо разницы между современными браузерами в выполнении регулярных выражений.

1 голос
/ 08 ноября 2008

Как уже упоминал Дэйв, Firefox не дает путь, только имя файла. Также, как он упомянул, это не учитывает различия между операционными системами. Я думаю, что лучшая проверка, которую вы могли бы сделать, это проверить, заканчивается ли имя файла PDF. Кроме того, это не гарантирует, что это действительный PDF, просто имя файла заканчивается PDF. В зависимости от ваших потребностей, вы можете проверить, что это действительно PDF, проверив содержимое.

1 голос
/ 08 ноября 2008

Если вы используете javascript, отсутствие в регулярном выражении косой черты приводит к ошибке в Firefox.

Попробуйте сделать var regex = /^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$/;

0 голосов
/ 08 ноября 2008

Я считаю, что JavaScript RE определены стандартом ECMA, и я сомневаюсь, что между интерпретаторами JS есть много различий. Я не нашел ни одного в своих программах или видел упомянутое в статье.

Ваше сообщение на самом деле немного сбивает с толку, так как вы добавляете туда ASP-контент. Я не понимаю, как вы пришли к выводу, что это ошибка браузера, когда вы говорите о серверной технологии или сгенерированном коде. На самом деле, мы даже не знаем, говорите ли вы о JS в браузере, проверке поля загрузки (вы больше не можете делать это, по крайней мере, простым способом, с помощью FF3) или на стороне сервера (ни FF, ни Opera ни Safari не загружают полный путь к загруженному файлу. Я удивлен, узнав, что Chrome любит IE ...).

0 голосов
/ 08 ноября 2008

Я не заметил разницы между браузерами в отношении синтаксиса шаблона. Однако я заметил разницу между C # и Javascript, поскольку реализация C # допускает обратные ссылки, а реализация Javascript - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...