Karena ekspresi reguler POSIX (ereg) sudah tidak digunakan lagi sejak PHP 5.3.0, saya ingin tahu cara mudah untuk mengubah ekspresi lama menjadi PCRE (Perl Compatible Regular Expressions) (preg) .
Sebagai contoh, saya memiliki ungkapan reguler ini:
eregi('^hello world');
Bagaimana saya bisa menerjemahkan ekspresi menjadi preg_match
ekspresi yang kompatibel?
Catatan: Posting ini berfungsi sebagai pengganti untuk semua pos yang terkait dengan konversi dari ereg ke preg, dan sebagai opsi duplikat untuk pertanyaan terkait. Tolong jangan tutup pertanyaan ini.
Terkait:
php
preg-replace
preg-match
pcre
ereg
netcoder
sumber
sumber
ereg [php]
tidak menghasilkan hasil yang sangat berguna. Oke, bisa berikan dukungan saya untuk yang satu ini.Jawaban:
Perubahan terbesar dalam sintaks adalah penambahan pembatas .
Pembatas bisa berupa apa saja yang bukan alpha-numeric, backslash, atau karakter whitespace. Yang paling banyak digunakan umumnya
~
,/
dan#
.Anda juga dapat menggunakan tanda kurung yang cocok:
Jika pembatas Anda ditemukan dalam ekspresi reguler, Anda harus menghindarinya:
Anda dapat dengan mudah keluar dari semua pembatas dan karakter yang dipesan dalam string dengan menggunakan preg_quote :
Juga, PCRE mendukung pengubah untuk berbagai hal. Salah satu yang paling banyak digunakan adalah pengubah case-insensitive
i
, alternatif untuk eregi :Anda dapat menemukan referensi lengkap untuk sintaks PCRE dalam PHP di manual , serta daftar perbedaan antara POSIX regex dan PCRE untuk membantu mengubah ekspresi.
Namun, dalam contoh sederhana Anda, Anda tidak akan menggunakan ekspresi reguler:
sumber
/^\/hello/
contoh.(a(b)c)
adalah PCRE yang benar-benar valid dan dibatasi. Saya pribadi suka menggunakan tanda kurung()
untuk mengingatkan diri saya bahwa pertandingan yang ditangkap pertama adalah segalanya.error_log
s mendapatkan penuh dengan peringatan ini:PHP Deprecated: Function ereg() is deprecated in...
. Argh!Penggantian Ereg dengan preg (pada PHP 5.3.0) adalah langkah yang tepat untuk kami.
preg_match, yang menggunakan sintaks ekspresi reguler yang kompatibel dengan Perl, seringkali merupakan alternatif yang lebih cepat untuk ereg.
Anda harus mengetahui 4 hal utama untuk mem-porting pola-pola prioritas:
Tambahkan pembatas (/):
'pattern' => '/pattern/'
Pembatas pembatas jika itu adalah bagian dari pola:
'patt/ern' => '/patt\/ern/'
Mencapai secara terprogram dengan cara berikut:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi (case-insensitive matching):
'pattern' => '/pattern/i'
Jadi, jika Anda menggunakan fungsi eregi untuk case-insenstive matching, tambahkan saja 'i' di akhir pola baru ('/ pattern /').Nilai ASCII : Dalam kesalahan, jika Anda menggunakan angka dalam pola, diasumsikan bahwa Anda mengacu pada ASCII karakter. Namun dalam preg, angka tidak diperlakukan sebagai nilai ASCII. Jadi, jika pola Anda mengandung nilai ASCII dalam ekspresi ereg (misalnya: baris baru, tab, dll.), Lalu konversikan ke hexadecimal dan awali dengan \ x.
Example: 9(tab) becomes \x9 or alternatively use \t.
sumber
Dari PHP versi 5.3,
ereg
sudah usang.Pindah dari
ereg
kepreg_match
hanya perubahan kecil dalam pola kita.Pertama, Anda harus menambahkan pembatas ke kode Anda, misalnya:
untuk
Untuk
eregi
pencocokan case-insensitive, letakkani
setelah pembatas terakhir, misalnya:untuk
sumber
Ada lebih banyak perbedaan antara
ereg()
danpreg_replace()
bukan hanya sintaks:Nilai pengembalian:
FALSE
ereg()
kembaliFALSE
,preg_match()
kembali0
ereg()
mengembalikan panjang string atau1
,preg_match()
mengembalikan selalu1
Array yang dihasilkan dari substring yang cocok: Jika beberapa substring tidak ditemukan sama sekali (
(b)
dalam...a(b)?
), item yang sesuai dalamereg()
hasilnya akanFALSE
, sedangkan dipreg_match()
dalamnya tidak akan diatur sama sekali.Jika seseorang tidak cukup berani untuk mengubah
ereg()
kepreg_match()
, dia dapat menggunakan mb_ereg () , yang masih tersedia di PHP 7.sumber