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, ]
và -
đơ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ự.
Nguồn
2011-09-10 14:42:12
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
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. –
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