Dizeden yalnızca alfasayısal karakterleri döndüren işlev?


102

Bir girdi dizgesini alacak ve sadece alfa-sayısal bırakarak tüm özel karakterleri sıyırıp temizlenmiş bir sürümünü döndürecek bir php işlevi arıyorum.

Aynı şeyi yapan ancak yalnızca alfabetik karakterleri A'dan Z'ye döndüren ikinci bir işleve ihtiyacım var.

Herhangi bir yardım çok takdir edilir.


Bunlar hangi Unicode Normalleştirme Formunda ve bunu neden yapmak isteyesiniz?
tchrist

1
AZ ve 'alfanümerik' dediğinizde, gerçekten sadece AZ'yi mi kastediyorsunuz yoksa yabancı diller ve eski komut dosyaları dahil tüm dillerdeki tüm harfleri eşleştirmek mi istiyorsunuz?
Mark Byers

Aksan duyarsız bir dizi karşılaştırması yapabilmek için bunu yapıyorsanız, yanlış bir şey yapıyorsunuz demektir.
tchrist

3
O var değil “bütün dillerden” sadece. Onun ingilizcesi. İngilizce, Latin alfabesini kullanır. Orada unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -lLatin alphabetics ama AZ değildir == 1192 kod noktaları. ASCII'nin İngilizce için yeterli olduğu yaygın bir efsanedir. Değildir ve bu yüzden AZ yazmanın bir kod kokusu vardır .
tchrist

1
@Scott B: İngilizce sadece A'dan Z'ye gelen 26 harfi kullanmaz. Örneğin özgeçmiş kelimesi é'yi içerir. Belki de ne yapmaya çalıştığınızı açıklayabilirsiniz, çünkü bu daha iyi yanıtlar almanıza yardımcı olabilir.
Mark Byers

Yanıtlar:


221

Uyarı: İngilizce'nin sadece AZ ile sınırlı olmadığını unutmayın.

Deneyin bu az, AZ ve 0-9 dışındaki her şeyi kaldırmak için:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

Alfasayısal tanımınız yabancı dillerdeki harfleri ve eski komut dosyalarını içeriyorsa, Unicode karakter sınıflarını kullanmanız gerekecektir.

Deneyin bu sadece AZ terk etmek:

$result = preg_replace("/[^A-Z]+/", "", $s);

Uyarının nedeni, özgeçmiş gibi kelimelerin ébununla eşleşmeyecek mektubu içermesidir . Belirli bir harf listesiyle eşleştirmek istiyorsanız, normal ifadeyi bu harfleri içerecek şekilde ayarlayın. Tüm harfleri eşleştirmek istiyorsanız, yorumlarda belirtildiği gibi uygun karakter sınıflarını kullanın.


2
Hayır, alfasayısaldır [\p{Alphabetic}\p{Numeric}]. PCRE alfabetik özelliğini unutuyorum, ancak bunu ile yaklaşık olarak tahmin edebilirsiniz [\pL\pM\pN].
tchrist

1
@tchrist: AZ'den özellikle bahsettiği için sadece bununla eşleşmek istediğini varsayıyorum, ancak sorunun bu noktada çok daha net olabileceğini kabul ediyorum. Bir açıklama isteyeceğim.
Mark Byers

1
@Mark, cevabınızın ikinci kısmı ile tartışmıyordum, ancak ilk önce dizeyi kanonik olarak ayrıştırmadıysa, doğru çalışmayacaktır. İlk bölümle tartışıyordum. Ayrıca, yalnızca küflü eski ASCII'de değil , herhangi bir veri üzerinde çalışan normal ifadeleri her zaman doğru yapmaya çalışıyorum . :) Bu nedenle, Milenyum'un bu tarafının bazen[A-Z] yanlış olduğu
tchrist

1
@Mark Byers, anlıyorum .. ve Evet tercih ediyorum iama sadece bir İngilizce demografisi için endişelenmem gerekiyor .. Birçok insanın diğer dilleri düşünmesi gerektiğini unutuyorum. BTW Daha önce hiç 1 soru sormamış en yüksek rep'li kullanıcı olduğunuzu fark ettim. Jon Skeet bile daha önce sorular sordu!
JD Isaacks

1
normal ifadenin sonunda neden + var? Kaldırırsan ... aynı olmaz mıydı?
Dennis

2

Yerine preg_replace, her zaman kullanabilirsiniz PHP'nin filtre fonksiyonlarını kullanarak filter_var()ile işlevini FILTER_SANITIZE_STRING.


PHP'nin ISO Stringprep algoritmasına erişimi var mı? Perl ve Java'nın yaptığını biliyorum.
tchrist

Dize filtresi işlevinin ağırlıklı olarak 7 bit ASCII ile çalıştığına inanıyorum, ancak bunda alıntı yapmayın.
Mark Baker

31
Lütfen bize kullanıcının kullanmak istediği şeyi yapmanın açık bir yolunu söyleyebilir misiniz FILTER_SANITIZE_STRING? Bildiğim kadarıyla, bu şekilde arşivlenebilecek en yakın şey ile FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH, ancak bu sadece harf ve rakamları değil, aynı zamanda noktaları, eğik çizgileri, yüzdeleri ve bunların hepsini bırakıyor.
Pere

5
Bir cevaptan çok bir yoruma benziyor. Cevap yazarken uygun bir açıklama yapın.
Siraj Alam

1
Maalesef orada alfanümerik için gerçek bir FILTER_SANITIZE olduğuna inanmıyorum. Oldukça büyük bir ihmal.
Kzqai

0
  1. Rakamlar [ 0-9 ] ve genel olarak alfabeler [ \ pL ] için Santize :
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. Özellikle A'dan Z'ye (büyük / küçük harf duyarlı) [ a-zA-Z ] alfabeleri için Santize :
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.