JSLint сообщает «Небезопасный ^» для моего регулярного выражения - что это значит? - PullRequest
9 голосов
/ 14 июня 2010

Я пытаюсь получить мой Javascript код на 100% чистым JSLint.

У меня есть регулярное выражение:

 linkRgx = /https?:\/\/[^\s;|\\*'"!,()<>]+/g;

Отчеты JSLint:

 Insecure '^'

Что делает использование отрицания набора символов "небезопасным"?

Ответы [ 3 ]

8 голосов
/ 15 июня 2010

[^\s;|\\*'"!,()<>] соответствует любому символу ASCII, кроме перечисленных, и любому не-ASCII символу. Поскольку строки JavaScript поддерживают Unicode, это означает каждый символ, известный Unicode. Я вижу большой потенциал для вреда там.

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

/\bhttps?:\/\/[-\w+&@#/%?=~|$!:,.;]*[\w+&@#/%=~|$]/g
5 голосов
/ 14 июня 2010

(отвечая на мой вопрос) Я немного покопался ... Документация JSLint гласит:

Запретить небезопасные. и [^ ...]. в / RegExp / regexp: true, если. и [^ ...] не должно быть разрешено в литералах RegExp. Эти формы не должны использоваться при проверке в защищенных приложениях.

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

/*jslint regexp: false*/
.... Javascript statement(s) ....
/*jslint regexp: true*/
0 голосов
/ 29 июня 2015

Вы должны использовать:

/*jslint regexp: true*/
linkRgx = /https?:\/\/[^\s;|\\*'"!,()<>]+/g;
/*jslint regexp: false*/
...