2011-12-01 123 views
13

Làm cách nào để xóa các ký tự, như dấu chấm câu, dấu phẩy, dấu gạch ngang, vv từ một chuỗi, theo cách an toàn nhiều byte?Regex để loại bỏ các ký tự không phải chữ và số từ các chuỗi UTF8

tôi sẽ làm việc với đầu vào từ nhiều ngôn ngữ khác nhau và tôi tự hỏi nếu có một cái gì đó có thể giúp tôi với điều này

Cảm ơn

+0

Bạn muốn giữ chỉ 'một-z' và' 0-9'? Hoặc là tất cả các ký tự đặc biệt từ các ngôn ngữ khác nhau? – Marcus

+0

giải thích lý do tại sao kết quả của tôi trong cách tiếp cận tốt hơn được đề xuất. –

+0

@Marcus. Tôi cần giữ các ký tự unicode – Thomas

Trả lời

24

Có những thingys lớp ký tự unicode mà bạn có thể sử dụng:

Để khớp với bất kỳ ký hiệu không phải chữ cái nào bạn chỉ có thể sử dụng \PL+, sự phủ định của \p{L}. Để không xóa dấu cách, hãy sử dụng một lớp con như [^\pL\s]+. Hoặc thực sự chỉ cần xóa dấu chấm câu với \pP+

Vâng, và rõ ràng là đừng quên regex /u công cụ sửa đổi.

+0

Tôi nghĩ cái này có tiềm năng. Tôi cần điều tra. Cảm ơn mario – Thomas

+2

[^ \ pL \ s] + là người chiến thắng – Thomas

+0

không biết chuỗi thoát hoạt động trong ngoặc vuông '[]'. Cảm ơn –

0

bài tương tự

Remove non-utf8 characters from string

Tôi không chắc chắn nếu điều này bao gồm tất cả các nhân vật mặc dù.

Theo bài đăng này trên diễn đàn dreamincode thứ

http://www.dreamincode.net/forums/topic/78179-regular-expression-to-remove-non-ascii-characters/

này nên làm việc

/[^\x{21}-\x{7E}\s\t\n\r]/ 
+0

Tôi nghĩ rằng điều này chỉ hoạt động đối với ASCII và nhà văn đề cập rõ ràng đến chuỗi UTF8. – Pateman

+0

Điều này không làm điều đó – Thomas

0

Có lẽ đây sẽ là hữu ích?

$newstring = preg_replace('/[^0-9a-zA-Z\s]/', $oldstring); 
+2

Điều này cũng sẽ xóa các ký tự không phải ASCII. Tôi không muốn điều này – Thomas

1

Tôi sử dụng này:

$clean = preg_replace("/[^\p{L}|\p{N}]+/u", " ", $raw); 
$clean = preg_replace("/[\p{Z}]{2,}/u", " ", $clean); 
+0

Bạn có thể mô tả chính xác những gì đang xảy ra ở đây không? –

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