Fungsi untuk mengembalikan hanya karakter alfanumerik dari string?

100

Saya mencari fungsi php yang akan mengambil string input dan mengembalikan versi bersihnya dengan menghapus semua karakter khusus yang hanya menyisakan alfa-numerik.

Saya membutuhkan fungsi kedua yang melakukan hal yang sama tetapi hanya mengembalikan karakter alfabet AZ.

Setiap bantuan sangat dihargai.

Scott B
sumber
Di dalam Formulir Normalisasi Unicode manakah ini, dan mengapa Anda ingin melakukan ini?
tchrist
1
Saat Anda mengucapkan AZ dan 'alfanumerik', apakah yang Anda maksud hanya AZ atau apakah Anda ingin mencocokkan semua huruf dari semua bahasa, termasuk bahasa asing dan skrip usang?
Mark Byers
Jika Anda melakukan ini sehingga Anda dapat melakukan perbandingan string yang tidak peka aksen, Anda melakukan hal yang salah.
tchrist
3
Ini bukan hanya “dari semua bahasa”. Ini bahasa Inggris. Bahasa Inggris menggunakan aksara Latin. Ada unichars '\p{Latin}' '\p{Alphabetic}' '[^A-Za-z]' | wc -l== 1192 poin kode yang merupakan alfabet Latin tetapi bukan AZ. Ada anggapan umum bahwa ASCII cukup untuk bahasa Inggris. Tidak, dan itulah mengapa menulis AZ memiliki bau kode untuk itu.
tchrist
1
@ Scott B: Bahasa Inggris tidak hanya menggunakan 26 huruf dari AZ. Misalnya kata resume menyertakan é. Mungkin Anda dapat menjelaskan apa yang Anda coba lakukan karena ini dapat membantu Anda mendapatkan jawaban yang lebih baik.
Mark Byers

Jawaban:

216

Peringatan: Perhatikan bahwa bahasa Inggris tidak terbatas hanya untuk AZ.

Coba ini untuk menghapus semuanya kecuali az, AZ dan 0-9:

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $s);

Jika definisi alfanumerik Anda menyertakan huruf dalam bahasa asing dan skrip usang, maka Anda perlu menggunakan kelas karakter Unicode.

Coba ini untuk menyisakan hanya AZ:

$result = preg_replace("/[^A-Z]+/", "", $s);

Alasan peringatan ini adalah karena kata-kata seperti resume berisi surat éyang tidak akan cocok dengan ini. Jika Anda ingin mencocokkan daftar huruf tertentu, sesuaikan ekspresi reguler untuk menyertakan huruf tersebut. Jika Anda ingin mencocokkan semua huruf, gunakan kelas karakter yang sesuai seperti yang disebutkan di komentar.

Mark Byers
sumber
2
Tidak, alfanumerik adalah [\p{Alphabetic}\p{Numeric}]. Saya lupa properti abjad PCRE, tetapi Anda dapat memperkirakannya dengan [\pL\pM\pN].
tchrist
1
@ tchrist: Saya berasumsi bahwa karena dia secara khusus menyebutkan AZ bahwa dia hanya ingin mencocokkannya, meskipun saya akui bahwa pertanyaannya bisa jauh lebih jelas tentang hal ini. Saya akan meminta klarifikasi.
Mark Byers
1
@ Mark, saya tidak berdebat dengan bagian kedua dari jawaban Anda, meskipun jika dia belum menguraikan string secara kanonik terlebih dahulu, itu tidak akan berfungsi dengan benar. Saya berdebat dengan bagian pertama. Juga, saya mencoba untuk selalu memperbaiki regex yang bekerja pada data apa pun , tidak hanya pada ASCII lama yang berjamur. :) Karenanya mantra bahwa sisi Milenium [A-Z]ini, terkadang selalu salah .
tchrist
1
@ Mark Byers, begitu .. dan Ya saya lebih suka itapi saya hanya perlu khawatir tentang demografi Inggris .. Saya lupa banyak orang harus memikirkan bahasa lain. BTW Saya baru tahu Anda adalah pengguna dengan reputasi tertinggi yang tidak pernah mengajukan 1 pertanyaan. Bahkan Jon Skeet pernah mengajukan pertanyaan sebelumnya!
JD Isaacks
1
mengapa ada + di akhir regexp? Bukankah akan ... sama jika Anda menghapusnya?
Dennis
2

Daripada preg_replace, Anda selalu bisa menggunakan fungsi filter PHP menggunakan filter_var()fungsi with FILTER_SANITIZE_STRING.

Mark Baker
sumber
Apakah PHP memiliki akses ke algoritma ISO Stringprep? Saya tahu Perl dan Java.
tchrist
Saya yakin fungsi filter string bekerja terutama dengan ASCII 7-bit, tetapi jangan mengutip saya tentang itu.
Mark Baker
30
Tolong, dapatkah Anda memberi tahu kami cara eksplisit melakukan apa yang diminta pengguna untuk digunakan FILTER_SANITIZE_STRING? Sepengetahuan saya, yang paling dekat yang bisa dicapai dengan cara ini adalah dengan FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH, tapi itu tidak hanya menyisakan huruf dan angka tapi juga titik, garis miring, persen dan itu semua.
Pere
$ iMycleanVar = filter_var ($ sStringWithNumbers, FILTER_SANITIZE_NUMBER_INT);
Sultanos
4
Ini lebih terlihat seperti komentar daripada jawaban. Berikan penjelasan yang tepat saat menulis jawaban.
Siraj Alam
0
  1. Santize untuk angka [ 0-9 ] dan huruf secara umum [ \ pL ]:
$string = preg_replace("/[^0-9\pL]+/", "", $string)
  1. Santize khusus untuk huruf A sampai Z (case-insensitive) [ a-zA-Z ]:
$string = preg_replace("/[^a-zA-Z]+/", "", $string)
Sky7ure
sumber