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.