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);
\wsertakan \ddan karenanya \dtidak perlu. Juga, ini salah karena juga akan meninggalkan garis bawah pada string yang dihasilkan (yang juga termasuk dalam \w).
ibendera benar-benar diperlukan di sini karena [:alnum:]sudah mencakup kedua kasus?
Ekspresi reguler adalah jawaban Anda.
$str = preg_replace('/[^a-z\d ]/i', '', $str);
isingkatan kasus sensitif.^ berarti, tidak dimulai dengan. \d cocok dengan angka apa pun. a-zcocok dengan semua karakter antara adan z. Karena iparameter Anda tidak perlu menentukan a-zdan A-Z.\dada 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:
/ubendera 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
\Wadalah kebalikan dari \wkarakter A-Za-z0-9_. Jadi \Wakan 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 ubendera 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_islamke 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().