Alfasayısal olmayan karakterler nasıl kaldırılır?


350

a-z A-Z 0-9Sette olmayan veya boşluk olmayan bir dizeden tüm karakterleri kaldırmak gerekiyor .

Bunu yapacak bir işlevi olan var mı?

Yanıtlar:


697

Görünüşe göre neredeyse ne yapmak istediğinizi biliyordunuz, bunu temel olarak bir normal ifade olarak tanımladınız.

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

8
zuk1: regexbuddy bu konuda çok yardımcı oluyor
14'te

2
Kısa çizgiyi izin verilen karakter olarak dahil etmek istiyorsanız bir örnek. E-posta adreslerine göre bir Moodle kullanıcı adından izin verilmeyen karakterleri çıkarmak için buna ihtiyacım vardı: preg_replace ("/ [^ a-z0-9 _. @ \ -] /", '', $ string);
Evan Donovan

2
Bu, tırnak işaretleri (çift tırnak) yerine normal ifadenin çevresindeki kesme işaretleri (tek tırnak) ile aynı şekilde çalışır mı? Örn:preg_replace('/[^A-Za-z0-9 ]/', '', $string);
2540625

3
Bunun hakkında açıklama istiyoruz :). İnsanlar buraya neden böyle olduğunu görmek için geliyorlar. Lütfen Regex açıklamasını da dikkate alın! Teşekkürler
Pratik

1
Aksanlı karakterleri tutmak istiyorsak ne olur?
wonzbak

169

Unicode karakterler için:

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

merhaba voondo, ne / ui şey .. buna ne diyorsun? Herkes bana biraz ışık tutabilir. Teşekkür ederim.
kebyang

4
Açıklamak için bunlara bayrak denir. Kapanış sınırlayıcıdan sonra konurlar (bu durumda "/", ancak "~" veya "@" veya açılış ve kapanış sınırlayıcıları aynı olduğu sürece kullanmak istediğiniz herhangi bir karakter olabilir) ve ifadenin davranışı.
Doktor J

1
Btw, \wiçerir \dve bu yüzden \dgereksizdir. Ayrıca, bu yanlıştır, çünkü sonuç dizesinde alt çizgi de bırakacaktır (buna da dahil edilmiştir \w).
smathy

2
Bunda hala bir hata var, karakter sınıflarının ':]' ile sonlandırılması gerekiyor, bu yüzden doğru satır şöyle olacaktır: preg_replace ("/ [^ [: alnum:] [: space:]] / ui", '', ) string $;
h00ligan

4
Her iki durumu da kapsadığı için ibayrak burada gerçekten gerekli [:alnum:]mi?
billynoah

50

Normal ifade cevabınızdır.

$str = preg_replace('/[^a-z\d ]/i', '', $str);
  • Büyük / iküçük harfe duyarlı değildir.
  • ^ anlamına gelmez.
  • \d herhangi bir rakamla eşleşir.
  • a-zarasındaki tüm karakterleri ile eşleşen ave z. Yüzünden iparametresi belirtmek gerekmez a-zve A-Z.
  • \dBir boşluk kaldıktan sonra , bu normal ifadede boşluklara izin verilir.

3
Bunun hakkında açıklama istiyoruz :). İnsanlar buraya neden böyle olduğunu görmek için geliyorlar. Lütfen Regex açıklamasını da dikkate alın! Herkes açıklama yapmadan orada ne yazdığınızı bilecek kadar ileri düzeyde değildir. Teşekkürler
Pratik

@PratikCJoshi i, büyük / küçük harfe duyarlı değildir. ^, ile başlamadığı anlamına gelir. \ d herhangi bir rakamla eşleşir. az, a ve z arasındaki tüm karakterlerle eşleşir. İ parametresi nedeniyle az ve AZ belirtmeniz gerekmez. \ D sonra bir boşluk var, bu yüzden boşluklar bu normal ifade izin verir.
bart

1
İnsanlar yok cevap olarak yorumları okuyun. Lütfen cevabı güncelleyin!
Pratik

18

İşte bunun için gerçekten basit bir regex:

\W|_

ve ihtiyacınız olduğunda kullanılır ( /eğik çizgi ayırıcı ile).

preg_replace("/\W|_/", '', $string);

Normal ifadenin ne yaptığını açıklayan bu harika araçla burada test edin:

http://www.regexr.com/


1
Yine de /ubayrağa ihtiyacınız vardır, aksi takdirde ascii olmayan harfler de kaldırılır.
Xeoncross

Temiz değil, aynı zamanda boşluk eşleşir ve bu isteniyorsa, muhtemelen kullanımıyla performansını ikiye katla karakter sınıfı ve ek nicelik için bir veya birden fazla [\W_]+
Bobble kabarcık

18

Tipik AZ yerine diğer dilleri desteklemeniz gerekiyorsa, aşağıdakileri kullanabilirsiniz:

preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
  • [^\p{L}\p{N} ]Bir tanımlar negated (O bir karakter maç olacak değil karakter sınıfı tanımlanmıştır):
    • \p{L}: herhangi bir dilden bir mektup .
    • \p{N}: herhangi bir komut dosyasındaki sayısal bir karakter .
    • : bir boşluk karakteri.
  • + açgözlülükle 1 ve sınırsız zamanlar arasındaki karakter sınıfıyla eşleşir .

Bu, AZ'nin yanı sıra diğer dillerden ve komut dosyalarından gelen harfleri ve sayıları koruyacaktır:

preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界

Not: Bu çok eski ama yine de alakalı bir soru. Tamamen gelecekteki ziyaretçiler için yararlı olabilecek ek bilgiler sağlamak için yanıt veriyorum.


8
[\W_]+

 

$string = preg_replace("/[\W_]+/u", '', $string);

AZ, az, 0-9 değil tümünü seçer ve siler.

Buradaki örneğe bakın: https://regexr.com/3h1rj


1
Bu normal ifade / [\ W _] + / u ne anlama geliyor?
Angelo Rigo

\Wbunların tersi \wkarakterdir A-Za-z0-9_. Böylece \Wolmayan herhangi bir karakterle eşleşecek A-Za-z0-9_ve onları kaldıracaktır. []Bir olan karakter kümesi sınır . +Bir karakter kümesi sınırda gereksiz ama normalde 1 ya da daha fazla karakter demektir. uBayrak o gibi karakter kodu 255 ötesine karakterleri kaldırmaz yani unicode karakter desteğini içerecek şekilde ifadesini genişletir ª²³µ. Unicode ve ascii karakterleri olan 3v4l.org/hSVV5 çeşitli kullanımlara örnek .
fyrye


0

Ben de cevabı arıyordum ve niyetim her alfa olmayanı temizlemekti ve birden fazla alan olmamalıydı.
Yani, bu kadar Alex'in cevabı modifiye ve bu benim için çalışıyor preg_replace('/[^a-z|\s+]+/i', ' ', $name)
döndü yukarıdaki regex sy8ed sirajul7_islamiçin sy ed sirajul islam
Açıklama: regex kontrol edecektir DEĞİL HER durumda a'dan z'ye duyarsız biri beyaz boşluk daha öyle ya, ve tek dönüştürülecektir Uzay.


-2

Dizeyi karakterlere bölebilir ve filtreleyebilirsiniz.

<?php 

function filter_alphanum($string) {
    $characters = str_split($string);
    $alphaNumeric = array_filter($characters,"ctype_alnum");
    return join($alphaNumeric);
}

$res = filter_alphanum("a!bc!#123");
print_r($res); // abc123

?>

Downvote nedeni: 3v4l.org/fqLVZ Ayrıca bilinmeyen uzunlukta bir dize üzerinde (3 + N) işlevlerini preg_replace()çağırmak , tek ve basit bir çağrıya kıyasla gerçekten çekici görünmüyor .
mickmackusa
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.