Yanıtlar:
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);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Unicode karakterler için:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
içerir \d
ve bu yüzden \d
gereksizdir. Ayrıca, bu yanlıştır, çünkü sonuç dizesinde alt çizgi de bırakacaktır (buna da dahil edilmiştir \w
).
i
bayrak burada gerçekten gerekli [:alnum:]
mi?
Normal ifade cevabınızdır.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
küçük harfe duyarlı değildir.^
anlamına gelmez. \d
herhangi bir rakamla eşleşir. a-z
arasındaki tüm karakterleri ile eşleşen a
ve z
. Yüzünden i
parametresi belirtmek gerekmez a-z
ve A-Z
.\d
Bir boşluk kaldıktan sonra , bu normal ifadede boşluklara izin verilir.İş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:
/u
bayrağa ihtiyacınız vardır, aksi takdirde ascii olmayan harfler de kaldırılır.
[\W_]+
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.
[\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
\W
bunların tersi \w
karakterdir A-Za-z0-9_
. Böylece \W
olmayan 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. u
Bayrak 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 .
preg_replace("/\W+/", '', $string)
Burada test edebilirsiniz: http://regexr.com/
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_islam
iç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.
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
?>
preg_replace()
çağırmak , tek ve basit bir çağrıya kıyasla gerçekten çekici görünmüyor .