Регулярные выражения: различия между браузерами

StackOverflow https://stackoverflow.com/questions/274024

Вопрос

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

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

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

^.+\.pdf$

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Попробуйте выполнить var regex = /^(([a-zA-Z]:)|(\\ карманный2 Event\w+)\$?)(\\(\w[\w].* )) (.pdf) $ /;.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top