2012-03-30 42 views
6

Tôi chỉ bị kẹt ở đây và không thể tìm thấy giải pháp. Tôi muốn thử chuyển đổi chuỗi thành chữ thường bằng cách sử dụng preg_replace. Tôi không thể tạo đúng regex. Lý do là bình thường strtolower không hỗ trợ các ký tự unicode. Tôi biết rằng tôi có thể sử dụng mb_strtolower nhưng chức năng này có vẻ khá chậm và bên cạnh đó không phải ai cũng có hỗ trợ MB.Cách chuyển đổi chuỗi thành chữ thường với preg_replace

Bất kỳ đầu mối nào?

Kính trọng, Radek

EDIT: Ok, Thanks a lot for guys giúp đỡ của bạn. Tôi nghĩ rằng cách tiếp cận của tôi không hoàn toàn chính xác. Tôi nghĩ sẽ tốt hơn nếu sử dụng điều này: How do I detect non-ASCII characters in a string? và sau đó sử dụng tương ứng hoặc strtolower hoặc mb_strtolower nếu có.

+8

Tôi curios, những gì làm cho bạn nghĩ rằng regex sẽ thực sự nhanh hơn mb_strtolower? –

+0

bạn có thể sử dụng hàm strtolower() php để chuyển đổi sting thành chữ thường. –

+0

@andreas Tôi không chắc chắn. Về cơ bản muốn thử nghiệm nó đầu tiên. –

Trả lời

5

Regex không thể thay đổi ký tự, chỉ có thể thay đổi thứ tự và/hoặc thêm các ký tự bổ sung/xóa một số ký tự.

preg_replace_callback hoặc /e cờ, nhưng chúng chỉ có thể thao tác với các hàm đã biết và do đó không thể làm tốt hơn strtolower.

Nếu bạn không thể dựa vào chức năng mb_strolower tồn tại, bạn sẽ phải tự thực hiện nó.

+0

SO cơ bản là không thể? –

+0

Có, về cơ bản là không thể. Regex là một công cụ để kết hợp mẫu và phân phối chuỗi, nó không thể tự biến đổi ký tự. – Nameless

0

Bạn không nên sử dụng preg_replace cho điều này vì preg_replace được sử dụng để khớp với một mẫu nhất định và thay thế bằng mẫu khác. Wat bạn muốn là thay thế mọi ký tự chữ hoa đơn lẻ bằng ký tự chữ thường, vì vậy không cần phải khớp với mẫu.

mb_strtolower sẽ là con đường để đi, và nếu bạn không có các chức năng mb_ bạn sẽ phải viết một hàm chính mình sử dụng rất nhiều str_replace của ...

+0

Có nhưng mb_stratolower rất chậm. Tôi đã làm một số thử nghiệm với để so sánh mb_strlower và strtolower bản địa và MB có vẻ là khoảng 30 lần chậm hơn so với bản địa. Vấn đề lớn nhất của tôi là tại thời điểm tôi phải làm strtolower tôi không biết nếu tôi có các ký tự unicode trong chuỗi hay không. –

+0

Có thể sử dụng strtolower đầu tiên, sau đó sử dụng preg_replace_callback để thay thế tất cả các ký tự không phải là ký tự chữ thường (/ [^ az] + /) và sau đó sử dụng mb_strtolower cho số – rednaw

+1

Tôi đến đây vì tôi đang tìm cách "decaptialize" string (vd: biến "' Chiến tranh của NextGen' "thành" 'cuộc chiến của nextGen'" - vì vậy đối với trường hợp này thấp hơn, toàn bộ chuỗi sẽ KHÔNG làm việc cho tôi. Tôi đang cố gắng sử dụng preg_replace với '"/\ b (\ w)/"' và chuỗi thay thế là 'strtolower (" $ 1 ")' - nhưng nó không hoạt động! Chắc chắn phải có một cách? –

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