2011-11-12 42 views
11

Tôi đang cố xóa mọi thứ ngoại trừ các chữ cái hợp lệ (từ bất kỳ ngôn ngữ nào) trong PHP. Tôi đã sử dụng điều này:RegEx: Loại bỏ các ký tự không phải chữ cái UTF-8 an toàn, nhanh chóng

$content=preg_replace('/[^\pL\p{Zs}]/u', '', $content); 

Nhưng nó rất chậm. Mất khoảng 30x dài hơn:

$content=preg_replace('/[^a-z\s]/', '', $content); 

Tôi đang xử lý một lượng lớn dữ liệu, vì vậy thực sự không thể sử dụng phương pháp chậm.

Có cách nào nhanh hơn để thực hiện việc này không?

+0

Cách thay thế duy nhất trong PHP là 'mb_ereg_replace', nhưng điều đó thậm chí còn chậm hơn. (Phần mở rộng 'iconv' không cung cấp khả năng lọc thư, và không biết gì khác.) – mario

+2

Bạn đã thử thêm' + ', ví dụ:'/[^ \ pL \ p {Zs}] +/u' ? Nó nên thực hiện tốt hơn một chút. – NullUserException

Trả lời

4

Vâng, đó là một thắc mắc nó chỉ chậm hơn 30 lần, thấy rằng nó cần phải mất khoảng 1000 lần nhiều ký tự hơn chỉ a-z vào tài khoản khi kiểm tra nếu một điểm mã nhất định là một chữ cái hay không.

Điều đó nói rằng, bạn có thể cải thiện regex của bạn một chút:

$content=preg_replace('/[^\pL\p{Zs}]+/u', '', $content); 

cần đẩy nó lên bằng cách kết hợp phi thư/dải phân cách không gian liền kề thành một hoạt động đơn lẻ thay thế.

2

Bạn có thể thử sử dụng phiên bản PCRE 8.20 mới với tùy chọn --enable-jit. Điều đó sẽ JIT biên dịch regex và có thể cải thiện hiệu suất cho bạn.

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