Saya tidak tahu dari setiap fungsi PHP built-in untuk menghapus semua karakter non-printable dari string, sehingga solusinya adalah dengan menggunakan
preg_replace
fungsi dengan ekspresi reguler yang sesuai.Solusi: Biarkan karakter ASCII hanya
Untuk tujuan saya, saya tidak harus bekerja dengan karakter Unicode, sehingga salah satu solusi terbaik untuk tujuan saya adalah untuk melucuti semua karakter non-ASCII dari string masukan. Itu bisa dilakukan dengan ini
preg_replace
kode:$ Hasil = preg_replace ( '/ [\ x00- \ x1F \ x80- \ xff] /', '', $ string);
Kode yang menghilangkan karakter apapun dalam hex berkisar 0-31 dan 128-255, hanya menyisakan karakter hex 32-127 dalam string yang dihasilkan, yang saya sebut
$result
dalam contoh ini.
Anda dapat melihat bagaimana ini bekerja di shell PHP interaktif. Dalam contoh ini saya hanya ingin menyingkirkan karakter 'dan', yang tidak bekerja dengan baik dalam aplikasi saya saat ini:
myprompt> -a php shell interaktif php> $ string = " 'Halo,' katanya."; php> $ hasil = preg_replace ( '/ [\ x00- \ x1F \ x80- \ xff] /', '', $ string); php> echo $ hasil; Halo, katanya.
Seperti yang Anda lihat, karakter 'dan' tidak di
$result
tali.Catatan: Anda dapat membaca lebih lanjut tentang hex dan urutan karakter oktal pada halaman php.net ini .
Juga mencatat bahwa jika Anda lebih suka karakter oktal ke karakter heksadesimal, kode ini harus bekerja juga:
$ Hasil = preg_replace ( '/ [\ 000- \ 031 \ 200 \ 377] /', '', $ string);
Aku hanya diuji bahwa pada contoh saya dan itu bekerja dengan baik, tapi saya belum diuji dengan string lainnya. ( Halaman ini adalah sumber yang baik untuk oktal dan hex dasar nilai-nilai.)
Solusi: Gunakan 'print' regex
Solusi lain yang mungkin adalah dengan menggunakan 'print' ekspresi reguler ditampilkan dalam contoh ini dengan
preg_replace
:$ Hasil = preg_replace ( '/ [[: ^ cetak:]] /', "", $ string);
Per doc PHP regex , yang
[:print:]
regex singkatan dari “setiap karakter yang dapat dicetak,” jadi misalnya saya pikir itu akan meninggalkan 'dan' karakter dalam string yang dihasilkan, tapi saya terkejut output terlihat seperti ini:php> $ string = " 'Halo,' katanya."; php> $ hasil = preg_replace ( '/ [[: ^ cetak:]] /', "", $ string); php> echo $ hasil; ?Halo,? dia berkata.
Aku tidak tahu mengapa itu regex berakhir menempatkan
?
karakter dalam string yang dihasilkan, sehingga pada saat saya menelepon ini “solusi yang mungkin” daripada solusi. Perhatikan bahwa jika Anda hanya echo
keluar string asli, mencetak baik:php> echo $ string; 'Halo,' katanya.
Lebih solusi (Unicode)
Seperti yang saya sebutkan, saya tidak memiliki menyibukkan diri dengan karakter Unicode, sehingga solusi karakter ASCII asli saya menunjukkan karya-karya baik bagi saya. Jika Anda perlu untuk menangani karakter Unicode, halaman SO ini menunjukkan solusi yang mungkin.
Lebih PHP ekspresi reguler
Akhirnya, sementara aku di lingkungan, di sini adalah daftar PHP “range” ekspresi reguler dari halaman php.net regex . Sebagai “range” nama menyiratkan, pola-pola ini dapat digunakan untuk mencocokkan rentangkarakter dalam string PHP:
[: Digit:] Hanya angka 0 sampai 9 [: Alnum:] Setiap karakter alfanumerik 0-9 OR A sampai Z atau untuk z. [: Alpha:] Setiap karakter alpha A sampai Z atau untuk z. [: Kosong:] Ruang dan karakter TAB saja. [: Xdigit:]. [: Punct:] Tanda baca simbol. , " ';?!: [: Cetak:] Setiap karakter yang dapat dicetak. [: Space:] Setiap karakter ruang. [: Grafik:]. [: Upper:] Setiap karakter alpha A sampai Z. [: Rendah:] Setiap karakter alpha untuk z. [: Cntrl:].
Seperti ditunjukkan dalam contoh saya sebelumnya, Anda benar-benar perlu menggunakan dua tanda kurung dengan pola-pola regex ketika menggunakan
preg_replace
:$ Hasil = preg_replace ( '/ [[: ^ cetak:]] /', "", $ string);
Ringkasan
Singkatnya, jika Anda ingin melihat cara menghapus karakter non-printable dari string di PHP, saya berharap contoh ini sangat membantu
EmoticonEmoticon