Jawaban:
Sepertinya Anda hampir tahu apa yang ingin Anda lakukan, pada dasarnya Anda mendefinisikannya sebagai regex.
preg_replace("/[^A-Za-z0-9 ]/", '', $string);
preg_replace('/[^A-Za-z0-9 ]/', '', $string);
Untuk karakter unicode, itu adalah:
preg_replace("/[^[:alnum:][:space:]]/u", '', $string);
\w
sertakan \d
dan karenanya \d
tidak perlu. Juga, ini salah karena juga akan meninggalkan garis bawah pada string yang dihasilkan (yang juga termasuk dalam \w
).
i
bendera benar-benar diperlukan di sini karena [:alnum:]
sudah mencakup kedua kasus?
Ekspresi reguler adalah jawaban Anda.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
i
singkatan kasus sensitif.^
berarti, tidak dimulai dengan. \d
cocok dengan angka apa pun. a-z
cocok dengan semua karakter antara a
dan z
. Karena i
parameter Anda tidak perlu menentukan a-z
dan A-Z
.\d
ada spasi, maka spasi diizinkan di regex ini.inilah regex yang sangat sederhana untuk itu:
\W|_
dan digunakan sesuai kebutuhan (dengan /
pembatas slash maju ).
preg_replace("/\W|_/", '', $string);
Uji di sini dengan alat hebat ini yang menjelaskan apa yang dilakukan regex:
/u
bendera jika tidak, huruf non-ascii juga dihapus.
[\W_]+
Jika Anda perlu mendukung bahasa lain, alih-alih AZ biasa, Anda dapat menggunakan yang berikut:
preg_replace('/[^\p{L}\p{N} ]+/', '', $string);
[^\p{L}\p{N} ]
mendefinisikan negated (Ini akan cocok dengan karakter yang tidak didefinisikan) kelas karakter dari:
\p{L}
: surat dari bahasa apa pun .\p{N}
: karakter numerik dalam skrip apa pun .
: karakter spasi.+
rakus cocok dengan kelas karakter antara 1 dan kali tidak terbatas .Ini akan mempertahankan huruf dan angka dari bahasa dan skrip lain serta AZ:
preg_replace('/[^\p{L}\p{N} ]+/', '', 'hello-world'); // helloworld
preg_replace('/[^\p{L}\p{N} ]+/', '', 'abc@~#123-+=öäå'); // abc123öäå
preg_replace('/[^\p{L}\p{N} ]+/', '', '你好世界!@£$%^&*()'); // 你好世界
Catatan: Ini adalah pertanyaan yang sangat lama, namun masih relevan. Saya menjawab murni untuk memberikan informasi tambahan yang mungkin berguna bagi pengunjung masa depan.
[\W_]+
$string = preg_replace("/[\W_]+/u", '', $string);
Itu memilih semua bukan AZ, az, 0-9 dan menghapusnya.
Lihat contoh di sini: https://regexr.com/3h1rj
\W
adalah kebalikan dari \w
karakter A-Za-z0-9_
. Jadi \W
akan cocok dengan karakter apa pun yang bukan A-Za-z0-9_
dan menghapusnya. Ini []
adalah batas karakter yang ditetapkan . Ini +
berlebihan pada batas karakter yang ditetapkan tetapi biasanya berarti 1 atau lebih karakter. The u
bendera memperluas ekspresi untuk menyertakan dukungan karakter unicode, yang berarti tidak akan menghapus karakter di luar karakter kode 255 seperti ª²³µ
. Contoh berbagai penggunaan 3v4l.org/hSVV5 dengan karakter unicode dan ascii.
preg_replace("/\W+/", '', $string)
Anda dapat mengujinya di sini: http://regexr.com/
Saya juga mencari jawabannya dan niat saya adalah untuk membersihkan setiap non-alpha dan seharusnya tidak ada lebih dari satu ruang.
Jadi, saya mengubah jawaban Alex untuk ini, dan ini berfungsi untuk saya
preg_replace('/[^a-z|\s+]+/i', ' ', $name)
. Regex di atas beralih sy8ed sirajul7_islam
ke sy ed sirajul islam
Penjelasan: regex akan memeriksa TIDAK SETIAP dari a ke z jika tidak sensitif atau lebih dari satu spasi, dan akan dikonversi menjadi satu ruang.
Anda dapat membagi string menjadi karakter dan memfilternya.
<?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()
.