2014-12-10 4 views
1

Я видел различные сообщения по этой теме, но я получаю странный результат, когда я делаю следующее:удалить недопустимые символы из имени файла Javascript

var dirtyString = '<>I\really|\re\ad?"the/wh\ole*:da|\y?.' 
var cleanString = dirtyString.replace(/[\/:*?"<>|.]/g, ""); 
console.log(cleanString); 

Она удаляет все недопустимые символы, но буквы «r» также удаляются. В журнале консоли я получаю «Ieallyeadthewholeday» Кажется, что «\» до «r» стирает «r». «\» не стирает другие буквы, которые он использовал раньше. Я что-то упускаю?

ответ

3

\r является символом возврата каретки. Если вам нужна обратная косая черта, за которой следует r, вам необходимо скрыть обратную косую черту: \\r.

\y не является зарезервированной escape-последовательностью, поэтому JavaScript интерпретирует ее как \, а затем y. Другие языки программирования, такие как C#, вместо этого повышают ошибку компилятора о непризнанной escape-последовательности.

Далее искажающие вещи: большинство регулярных выражений Синтаксисов имеют свой собственный обратный слэш экранирующие последовательности, которые отличаются от языка хостинга, таких как характер классы \W, \d и т.д. К счастью, они работают, потому что \W и \d не зарезервированные в JavaScript , но, по мнению этого автора, имеет смысл избежать обратных косых черт, чтобы просто понять читателя, или если вы хотите, чтобы ваши регулярные выражения были переносимыми между языками.

+0

Спасибо. Хотя я застрял. В принципе, мой пользователь может ввести строку в текстовое поле, и эта строка будет использоваться в качестве имени файла. Я хотел удалить все незаконные символы, прежде чем сделать это именем файла. Так что, если пользователь случайно набирает строку \ r в своей строке, то мне просто нужно признать, что r будет стерта? – user3080392

+0

@ user3080392 не полагаются на проверку на стороне клиента. Если пользователь отключает JavaScript и загружает недопустимое имя файла, что происходит? – Dai

+0

Да, может быть, я выясню другой способ именования файла. Благодарю. – user3080392

1

Если вы попробуете console.log(dirtyString), вы также увидите, что ваш «r» также «отсутствует».

Это потому, что '\ r' на самом деле является управляющей последовательностью для Возврат каретки символ (код 13). Ваша функция replace() ничего не делает для этого. Он все еще там просто не отображается. Попробуйте сыграть с String.charAt() и String.charCodeAt(), и вы увидите, что персонаж все еще там.

В качестве побочного примечания вы пытаетесь удалить символы «черного списка», а черный список почти никогда не подходит. Как вы можете видеть в своем собственном случае, вы забыли черный список «\ r» (и многие другие). Гораздо безопаснее использовать белый список. Например, вы можете решить, что принимаете только латинские буквы и цифры, а затем удаляете все, что не белое: var cleanString = dirtyString.replace(/[^a-z0-9]/gi, "");.

+0

Спасибо за подсказку по белым спискам. Я не знал об этом. Интересно, какая часть (/ [^ a-z0-9]/gi, ""); говорит «за исключением» или «не» a-z0-9. Это символ? – user3080392

+0

Да, вы правы, его символ ^. Для получения дополнительной информации о проверке регулярных выражений http://www.regular-expressions.info/quickstart.html –