2014-04-29 11 views
5

Các regex phổ biến nhất gợi ý để loại bỏ ký tự đặc biệt có vẻ là này -Regex để loại bỏ charaters đặc biệt đối với một chuỗi đa ngôn ngữ

preg_replace('/[^a-zA-Z0-9]/', '', $string); 

Vấn đề là nó cũng loại bỏ ký tự không phải tiếng Anh.

Có regex nào xóa các ký tự đặc biệt trên tất cả các ngôn ngữ không? Hoặc giải pháp duy nhất là đối sánh rõ ràng từng ký tự đặc biệt và xóa chúng?

Trả lời

3

Bạn có thể sử dụng thay vì:

preg_replace('/\P{Xan}+/u', '', $string); 

\p{Xan} là tất cả những gì là một con số hoặc một lá thư trong bất kỳ bảng chữ cái của bảng unicode.
\P{Xan} là tất cả không phải là số hoặc chữ cái. Nó là một phím tắt cho [^\p{Xan}]

+0

Cảm ơn! Tôi hiểu rằng '\ P' là một ký tự không có thuộc tính Unicode. Bạn có thể giải thích '{Xan}'. –

+1

@ A.Jesin: chữ hoa P chỉ được sử dụng để loại bỏ một lớp ký tự unicode. Ví dụ '\ p {Latin}' là một lớp ký tự cho tất cả các chữ cái Latinh (như '[a-zA-Z]' nhưng với dấu trọng âm), Nếu bạn muốn phủ nhận nó để có được tất cả không phải là chữ cái Latinh, bạn viết '\ P {Latin}' –

+3

@ A.Jesin: Bạn có thể tìm tất cả các lớp ký tự unicode trong tài liệu này: http://pcre.org/pcre.txt –

3

Bạn có thể sử dụng:

$string = preg_replace('/[^\p{L}\p{N}]+/u', '', $string); 
Các vấn đề liên quan