Giải pháp (mà các câu trả lời khác không đề cập đến — ít nhất là tại thời điểm tôi viết bài này) là khi PHP đề cập đến các dấu phân cách, nó không đề cập đến các dấu phân cách bạn thấy trong mã của mình (đó là các dấu ngoặc kép) mà là ký tự bên trong chuỗi. (Thực tế là tôi chưa bao giờ thấy điều này được nêu ở bất kỳ đâu trong bất kỳ tài liệu nào: bạn phải xem nó trong các ví dụ.) Vì vậy, thay vì có cú pháp biểu thức chính quy như những gì bạn có thể quen với từ nhiều ngôn ngữ khác:
/something/
PHP sử dụng chuỗi, sau đó tìm bên trong chuỗi để tìm dấu phân cách khác :
'/something/'
Dấu phân tách mà PHP đang đề cập đến là cặp /
ký tự, thay vì cặp '
ký tự. Vì vậy, nếu bạn viết 'something'
, PHP sẽ lấy s
làm dấu phân cách dự định và phàn nàn rằng bạn không được phép sử dụng các ký tự chữ và số làm dấu phân cách.
Vì vậy, nếu bạn muốn chuyển (ví dụ) một i
để cho thấy rằng bạn muốn đối sánh không phân biệt chữ hoa chữ thường, bạn chuyển nó vào bên trong chuỗi nhưng bên ngoài các dấu phân cách regex:
'/something/i'
Nếu bạn muốn sử dụng thứ gì đó khác ngoài /
làm dấu phân tách, bạn có thể, chẳng hạn như nếu bạn đang khớp một URL và không muốn phải thoát khỏi tất cả các dấu gạch chéo:
'~something~'
preg_match()
dưới dạng biến, hãy đảm bảo rằng bạn không nhận được thứ tự của các biến vô tình bị trộn lẫn trong lệnh gọi hàm vì điều này cũng gần như chắc chắn sẽ dẫn đến kết quả tương tự lỗi xuất hiện.