2012-03-30 16 views
6

Sadece buna takıldım ve çözüm bulamıyorum. preg_replace kullanarak bir dize küçük harfe dönüştürmeyi denemek istiyorum. Sadece doğru ifadeyi oluşturamıyorum. Nedeni, normal strtolower unicode karakterleri desteklememesidir. mb_strtolower'u kullanabileceğimi biliyorum, ancak bu işlev çok yavaş görünüyor ve yanında herkesin MB desteği yok.Bir dizgiyi preg_replace ile küçük harfe dönüştürmek

Herhangi bir ipucu?

Selamlar, Radek

DÜZENLEME: Tamam, teşekkürler yardım çocuklar için çok şey var. Benim yaklaşımımın doğru olmadığını düşünüyorum. Bunu kullanmak çok daha iyi olurdu: How do I detect non-ASCII characters in a string? ve daha sonra sırasıyla strtolower veya mb_strtolower kullanın.

+8

yazmak gerekecek, ne yapar regex'in mb_strtolower'den daha hızlı olacağını düşünün mü? –

+0

Sting'i küçük harfe dönüştürmek için strtolower() php işlevini kullanabilirsiniz. –

+0

@andreas Emin değilim. Temel olarak önce test etmek istedim. –

cevap

5

Regex karakterleri kendi başlarına değiştiremez, yalnızca siparişlerini değiştirebilir ve/veya ek karakterler ekleyebilir/bunlardan bazılarını silebilir.

preg_replace_callback veya /e bayrağı var, ancak bunlar yalnızca bilinen işlevlerle işleyebilir ve bu nedenle strtolower'dan daha iyi yapamazlar.

Eğer mb_strolower işlevinin varlığına güvenemezseniz, bunu kendiniz uygulamak zorundasınız.

+0

SO, temel olarak mümkün değil mi? –

+0

Evet, temelde mümkün değil. Regex, desen eşleştirmesi ve dizgisi yeniden derlemesi için bir araçtır. Karakterleri kendi başına değiştiremez. – Nameless

0

Bunun için preg_replace kullanmamalısınız çünkü preg_replace belirli bir desenle eşleşmek ve başka bir şeyle değiştirmek için kullanılır. İstediğiniz wat, her büyük harfli karakteri küçük harfle değiştirmektir, dolayısıyla bir desenle eşleşmeye gerek yoktur.

mb_strtolower gitmek yol olacaktır ve MB_ işlevleri yoksa kendinizi str_replace en çok kullanan bir işlev ... Ben meraklı olduğum

+0

Evet ama mb_stratolower çok yavaş. Ben mb_strlower ve yerli strtolower karşılaştırmak için bazı test yaptım ve MB yerli biri yaklaşık 30 kat daha yavaş gibi görünüyor. En büyük sorunum şu ki, strtolower'ı yapmak zorunda olduğumda, dizede unicode karakterlerin olup olmadığını bilmiyorum. –

+0

Belki de strtolower'ı kullanın, sonra varsayılan küçük harf karakterleri olmayan tüm karakterleri (/ [^ az] + /) değiştirmek için preg_replace_callback komutunu kullanın ve sonra buraya geldiğim için – rednaw

+1

için mb_strtolower komutunu kullanın çünkü buraya "decaptialize" için bir yol arıyordum dize (örneğin "NextGen'in Savaşı" nı "nextGen'in savaşı" na döndürün - bu durumda, daha düşük bir kasa için tüm dizge benim için işe yaramayacaktır. preg_replace'ı "/ \ b" ile kullanmaya çalışıyordum (\ w)/"' ve strtolower ("$ 1") olarak değiştirme dizgisi - ama işe yaramıyor! Elbette bir yolu olmalı? –

İlgili konular