2010-07-20 36 views
6

Tôi đang sử dụng regex sau để loại bỏ các ký tự điều khiển không in từ đầu vào của người dùng trước khi chèn các giá trị vào cơ sở dữ liệu.preg_replace để loại bỏ các ký tự không in dường như xóa tất cả các ký tự ngoài cũng như

preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value) 

Có vấn đề với việc sử dụng điều này trên chuỗi utf-8 không? Dường như loại bỏ tất cả các ký tự không phải là ascii hoàn toàn.

Trả lời

8

Một phần của sự cố là bạn không coi mục tiêu là chuỗi UTF-8; bạn cần sửa đổi /u cho điều đó. Ngoài ra, trong UTF-8 bất kỳ ký tự không phải ASCII nào được biểu thị bằng hai hoặc nhiều byte, tất cả chúng trong phạm vi \x80..\xFF. Hãy thử điều này:

preg_replace('/\p{Cc}+/u', '', $value) 

\p{Cc} là tài sản Unicode cho ký tự điều khiển, và u nguyên nhân cả regex và chuỗi mục tiêu được coi là UTF-8.

+0

Nó có để lại các ký tự hợp lệ ngoài phạm vi ASCII, như ký tự di chuyển Ba Lan (như ąęćśńżź) không? Tôi đang tìm một biểu thức chính quy sẽ loại bỏ các chuỗi UTF-8 không hợp lệ (vì vậy MySQL sẽ không phàn nàn trong khi chèn một chuỗi như vậy vào cơ sở dữ liệu), nhưng để mọi thứ khác không bị ảnh hưởng. – pako

+0

Tôi nghĩ rằng bạn muốn sử dụng ''/ \ P {Any}/u'' -' Any' nên tự giải thích, và '\ P {}' (chữ hoa) là dạng phủ định của '\ p {} '. Nhưng tôi muốn được quan tâm nhiều hơn đến cách những chuỗi byte không hợp lệ đã có trong đó ở nơi đầu tiên. –

5

Bạn có thể sử dụng Unicode character properties

preg_replace('/[^\p{L}\s]/u','',$value); 

(Làm thêm các lớp khác mà bạn muốn để cho qua)

Nếu bạn muốn trở lại unicode để ascii, không phải là fullproof nhưng với một số bản dịch tốt đẹp:

echo iconv('utf-8','ascii//translit','éñó'); //prints 'eno' 
+0

LƯU Ý: URL trên bị hỏng và SO sẽ không cho phép tôi chỉnh sửa câu trả lời; URL chính xác là: http://php.net/manual/en/regexp.reference.unicode.php – DOOManiac

+0

@DOOManiac: OK, cảm ơn bạn vì đã chỉ ra nó, đã sửa URL. – Wrikken

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