2010-11-05 27 views
42

Báo cáo JSLint Không an toàn '^' cho dòng sau. Tại sao vậy? Hoặc là nó sẽ khiếu nại bất cứ lúc nào tôi muốn phủ nhận một lớp nhân vật?JSLint "không an toàn ^" trong biểu thức chính quy

// remove all non alphanumeric, comma and dash characters 
"!$7s-gd,&j5d-a#".replace(/[^\w,\-]/g, ''); 
+1

Bởi vì đó là JSLint: p Có thể sự phủ định có thể được xem là "chấp nhận quá nhiều" bao gồm các ký tự điều khiển [unicode] vui (nó chỉ có thể đoán tại regex, nó không biết nó ngữ nghĩa). –

+1

FWIW, bạn không cần phải thoát khỏi - nơi bạn có nó. – Robusto

+1

@Robusto, thoát dấu gạch nối rõ ràng trong các lớp ký tự là một đề xuất JSLint khác. –

Trả lời

38

Nó sẽ chỉ làm điều này nếu bạn có tùy chọn chọn ở phía dưới:

Disallow insecure . and [^...] in /RegExp/ 

Từ the docs:

đúng nếu. và [^ ...] không được phép trong các ký tự RegExp. Không nên sử dụng các biểu mẫu này khi xác thực trong các ứng dụng bảo mật.

Vì vậy, trả lời câu hỏi của bạn, nếu bạn bắt đầu một regex với ^ và nó được chọn, có nó sẽ ném lỗi mỗi lần. Vấn đề là với các ký tự unicode, bạn đang cho phép khá nhiều thứ trong đó và có tiềm năng cho các vấn đề bảo mật hoặc xác thực bỏ qua các vấn đề. Thay vì không cho phép thứ gì đó (có thể bỏ qua), chỉ cho phép chỉ những ký tự hợp lệ.

+3

Blergh, JSLint không đủ thông minh để thấy rằng tôi đang thay thế mọi thứ * nhưng * những thứ đó? string.match (/ [\ w, \ -]/g, '') .join ('') nó là, sau đó. –

+15

@Tom JSLint không * quan tâm * những gì bạn đang làm chỉ cung cấp các khuyến nghị và phương pháp hay nhất để giữ cho JavaScripter mới làm quen với những sai lầm ngu xuẩn. Nếu bạn có thể biện minh cho những gì bạn đang làm bằng mọi cách, hãy làm điều đó, nhưng đừng phàn nàn rằng JSList không thích nó. – xj9

+18

Việc phàn nàn về sự khắt khe của JSLint là một trò tiêu khiển của các chuyên gia toàn cầu trên toàn thế giới. – ErikE

0

Xem xét sử dụng \W thay vì /^\w/

"!$7s-gd,&j5d-a#".replace(/\W/g, ''); 

Đối với trường hợp cụ thể của bạn này sẽ không làm việc bởi vì bạn muốn để lại dấu phẩy và dấu gạch ngang chữ, nhưng tôi nghĩ rằng đó là điều đáng nói.

6

regexp: true

trong các tùy chọn lint của bạn, sẽ cho phép

. and [^...] in /RegExp/

bạn có thể cấu hình các quy tắc mà bạn muốn sử dụng ở đây

http://www.jslint.com/

Các vấn đề liên quan