2011-09-10 35 views
10

http://php.net/manual/en/function.preg-quote.php:Tại sao chúng ta cần phải thoát khỏi! < >: = - trong biểu thức chính quy php?

Ký tự biểu thức chính quy đặc biệt là:. \ + *? [^] $() { } =! <> | : -

Tuy nhiên this page nói rằng ký tự đặc biệt là [ \^$ . | ? * + ()

Ok Tôi biết rằng trang đầu tiên là cụ thể về biểu thức thông thường php. Tuy nhiên, tại sao chúng tôi cần phải thoát khỏi số !, <, >, :, =, -?

Tôi đã cố gắng thực hiện preg_match mà không cần thoát <, >, -! và mọi thứ hoạt động hoàn hảo.

Trả lời

5

Những ký tự này là siêu ký tự, nhưng chúng không cần thoát. Những gì họ có điểm chung là chúng xuất hiện trong các cấu trúc nhóm đặc biệt:

(?:...)  # non-capturing group 
(?=...)  # positive lookahead 
(?!...)  # negative lookahead 
(?<name>...) # named capturing groups 
(?<=...)  # positive lookbehind 
(?<!...)  # negative lookbehind 
(?>...)  # atomic group 

Nhưng chúng chỉ mang ý nghĩa đặc biệt trong ngữ cảnh này. Vì vậy, nếu bạn lấy bất kỳ chuỗi ký tự nào và thoát khỏi tất cả các ký tự sau: [\^$.|?*+(){, thì bạn sẽ có được một regex khớp chính xác với ký tự chuỗi bởi ký tự vì các siêu ký tự khác không bao giờ có thể ở trong một ngữ cảnh meta.

Ví dụ: ] chỉ là một siêu ký tự nếu có trước đó chưa được thoát [ đã mở lớp nhân vật.

Tương tự, - chỉ là một metacharater trong một lớp nhân vật, có nghĩa là "phạm vi" như trong [a-z] (hoặc một chữ - như trong [abc-].

Vì vậy, để thoát chuỗi [tag-soup] bạn chỉ cần thoát khỏi số [. Ngoài lớp nhân vật, ]- đơn giản được coi là chữ.

Tóm lại, nếu bạn lấy một chuỗi và thoát tất cả các siêu ký tự "vô điều kiện" ([\^$.|?*+(){) thì bạn sẽ có được một regex khớp chính xác với ký tự chuỗi theo ký tự.

+0

tại sao 'preg_quote' thoát chúng nếu chúng không cần thoát? những gì bắt? – Pacerier

+0

Nghe có vẻ hơi quá mức với tôi. Nếu chuỗi đầu vào của bạn là '(? :)', thì '\ (\?: \)' Sẽ là phiên bản thoát đúng. '\ (\? \: \)' có thể sẽ không bị tổn thương vì trong nhiều trình tự regex, các trình tự thoát không rõ chỉ đơn giản là bị bỏ qua, nhưng một số thì gây ra lỗi trên chúng, vì vậy thường là không nên thoát ra nhiều hơn mức cần thiết. –

+0

thậm chí có 1 tình huống không thoát khỏi những tình huống đó có thể thất bại không? hoặc là an toàn để giả sử nó sẽ không thất bại 100%. – Pacerier

4

Trang bạn liên kết đến có tiêu đề "cú pháp regex cơ bản". Có một liên kết đến một trang có tiêu đề "advanced regex syntax". Ở đây tất cả các ký tự thừa bạn chỉ định được sử dụng.

  • ! được sử dụng cho lookaheads tiêu cực và lookbehinds
  • < được sử dụng cho lookbehinds
  • > được sử dụng cho các nhóm nguyên tử
  • : được sử dụng để thiết lập cờ cho chỉ là một phần của một regex
  • = được sử dụng cho những người nhìn tích cực và lookbehinds
  • - được sử dụng cho ký tự r anges và điều chỉnh cờ
+0

nhưng tại sao chúng ta cần phải thoát khỏi chúng? tại sao 'preg_quote' thoát chúng? Mặc dù tôi đã không thoát khỏi chúng, mọi thứ đều hoạt động tốt. – Pacerier

+0

@Pacerier Vì bạn có thể chỉ chèn một phần của một regex. Hoàn cảnh mà nó sẽ là một vấn đề khá mơ hồ, nhưng không thể tưởng tượng được. – lonesomeday

+0

bạn có thể đưa ra 1 ví dụ (có thể trong câu hỏi chỉnh sửa thx) không thoát ra được! hoặc < or > sẽ bị lỗi? bởi vì có nó là không thể tưởng tượng cho tôi ngay bây giờ. – Pacerier

1

Các ký tự này được sử dụng trong biểu thức tiêu cực/tích cực nhìn sau/phía trước/xung quanh. Ví dụ:

/^foo(?<!z)bar$/ 

Xem here để biết thêm thông tin.

3

Một dấu gạch ngang là một nhân vật đặc biệt bên trong các lớp nhân vật:

[a-zA-Z0-9] 

Những người khác có ý nghĩa trong nhóm phù hợp, ví dụ cho lookahead/lookbehind:

(?<=foo) 
(?!bar) 

Tôi đồng ý với bạn rằng không ai trong số những thứ này cần được trốn thoát. Khi dấu ngoặc đơn và dấu ngoặc vuông được thoát ra, các ký tự khác sẽ mất đi ý nghĩa đặc biệt của chúng.

+0

tại sao 'preg_quote' thoát chúng nếu chúng không cần thoát? những gì bắt? – Pacerier

+0

Không bắt được. Những nhân vật đó không cần phải được trốn thoát. Bất cứ ai đã viết phương pháp đó chỉ là quá nhiệt tình. –

1

Nhiều ký tự đặc biệt chỉ trong một ngữ cảnh nhất định. Từ những điều cơ bản, một vài ví dụ:

/-/  # dash 
/[a-z]/ # range 
/[-a-z]/ # a-z or dash 

/[^]/  # literal 
/^/  # meta-character 

/!/  # literal 
/(?!...)/ # meta-character 
Các vấn đề liên quan