Нужно регулярное выражение для приемлемых имен файлов - PullRequest
1 голос
/ 03 сентября 2010

Я использую Fancy Upload 3 и onSelect файла, мне нужно выполнить проверку, чтобы убедиться, что у пользователя нет плохих символов в имени файла. В настоящее время я заставляю людей загружать файлы с иероглифами и тому подобным в именах.

Мне нужно проверить, содержит ли имя файла только:

  1. A-Z
  2. A-Z
  3. 0-9
  4. _ (подчеркивание)
  5. - (минус)
  6. КОСМОС
  7. ÀùàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü (как одиночный и двойной байт)

Очевидно, вы можете увидеть трудную вещь там. Неанглийские одно- и двухбайтовые символы.

Я видел это:

[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]

А это:

[\x80-\xA5]

Но ни один из них не в полной мере освещает ситуацию правильно.

Примеры, которые должны работать:

  1. fást.zip
  2. abc.zip
  3. ABC.zip
  4. Über.zip

Примеры, которые НЕ должны работать:

  1. ΣΣøΔ.zip
  2. ¡вау! .Zip
  3. • §ªº¶.zip

Следующее близко, но я НЕТ RegEx'pert, даже не близко.

var filenameReg = /^[A-Za-z0-9-_]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF]+$/;

Заранее спасибо.


Решение от Zafer в основном работает, но оно не перехватывает все остальные символы, см. Ниже.

Uncaught:

¡£¢§¶ª«ø¨¥®´åß©¬æ÷µç

Пойманный:

™∞•–≠'"πˆ†∑œ∂ƒ˙∆˚…≥≤˜∫√≈Ω

Regex:

var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;

Ответы [ 4 ]

1 голос
/ 03 сентября 2010

Чередование между двумя классами символов (т. Е. [abc]|[def]) можно упростить до одного класса символов ([abcdef]) - первый можно прочитать как "(a или b или c) ИЛИ (d или e или f) ";вторая как "(а или б или с или д или е или f)".Что, вероятно, сработало в вашем регулярном выражении, это неэкранированный тире в первом классе - если вы хотите буквальный тире, это должен быть последний символ в классе.working:

var filenameReg = /^[A-Za-z0-9_\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF-]+$/;

Проблема в том, что вы не учитываете расширение файла, но это простая модификация (при условии, что вы всегда получаете файлы .zip):

var filenameReg = /^[A-Za-z0-9_\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF-]+\.zip$/;

Заменить zip другим шаблоном, если расширение отличается.

0 голосов
/ 03 сентября 2010

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

var filenameReg = /^[A-Za-z0-9_\-\ ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü]+$/;
0 голосов
/ 03 сентября 2010

У нас есть разные правила для разных платформ.Но я думаю, что вы имеете в виду длинные имена файлов в Windows.Для этого вы можете использовать следующие RegEx:

var longFilenames = @ "^ [^ \ ./: * \? \" "<> \ |] {1} [^ \ /: * \? \""<> \ |] {0,254} $";

ПРИМЕЧАНИЕ. Вместо того, чтобы говорить, какой символ разрешен, вам необходимо указать, какие из них не разрешены!

не завершен на 100% RegEx.Если вы действительно хотите завершить его, вы должны добавить исключения и для зарезервированных имен.

Более подробную информацию о правилах имен файлов можно найти здесь:

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

0 голосов
/ 03 сентября 2010

Должно работать следующее:

var filenameReg = /^([A-Za-z0-9\-_. ]|[\x00A0-\xD7FF\xF900-\xFDCF\xFDF0-\xFFEF])+$/;

Я поставил \ рядом с - и сгруппировал два выражения, иначе знак + не влияет на первое выражение.

РЕДАКТИРОВАТЬ 1: Iтакже положил.в выражении.

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