preg_match($pattern, $subject, $matches) memeriksa apakah sebuah string cocok dengan regular expression. Fungsi ini mengembalikan 1 jika cocok dan 0 jika tidak, serta mengisi $matches dengan apa yang ditemukannya: preg_match('/\d+/', 'Order 4521 shipped', $m) mengembalikan 1 dan mengisi $m[0] dengan "4521".
Polanya berupa string dengan delimiter di sekelilingnya, biasanya /.../, diikuti modifier seperti i. Tulis pola dengan tanda kutip tunggal: di dalam tanda kutip ganda, PHP lebih dulu memperluas $name dan escape seperti \x41 atau \101, sehingga engine regex bisa menerima pola yang berbeda dari yang kamu ketik.
Capture group
Tanda kurung di dalam pola menangkap bagian string yang dicocokkannya. $m[0] adalah seluruh kecocokan, $m[1] grup pertama, $m[2] grup kedua, dihitung berdasarkan tanda kurung buka dari kiri.
Named group
(?<name>...) memberi nama pada sebuah grup. Nilainya disimpan di bawah nama itu dan di bawah nomornya, jadi kode yang membaca hasilnya tidak rusak saat seseorang menambahkan grup lain di bagian awal pola.
Menemukan setiap kecocokan dengan preg_match_all
preg_match_all() terus mencari setelah kecocokan pertama dan mengembalikan jumlah kecocokannya. Secara default, $m[0] berisi semua kecocokan lengkap dan $m[1] berisi semua nilai grup pertama. Dengan PREG_SET_ORDER, kamu mendapat satu array per kecocokan, yang lebih mudah ditelusuri dengan loop.
Validasi input: anchor, nomor telepon, kode pos
Untuk validasi, polanya harus cocok dengan seluruh string, jadi awali dengan ^ dan akhiri dengan $. Ada satu jebakan: $ juga cocok sebelum baris baru di akhir, jadi '/^\d+$/' menerima "123\n". Tambahkan modifier D, atau pakai \z, yang hanya cocok di ujung paling akhir.
Untuk alamat email, regex pasti menolak alamat yang valid atau menerima alamat yang tidak valid. Pakai filter_var($email, FILTER_VALIDATE_EMAIL) sebagai gantinya (lihat filter_var()).
Modifier u untuk teks UTF-8 dan Jepang
Tanpa modifier u, sebuah pola bekerja pada byte. Satu karakter Jepang berukuran tiga byte di UTF-8, jadi . cocok dengan sepertiga karakter dan panjangnya jadi salah. Dengan u, pola bekerja pada karakter dan kamu bisa memakai kelas properti Unicode.
u juga memvalidasi subjeknya: jika string-nya bukan UTF-8 yang valid, preg_match() mengembalikan false alih-alih mencocokkan.
Escape input pengguna dengan preg_quote
Karakter seperti ., +, ?, (, dan / punya arti khusus di dalam pola. Jika sebagian pola berasal dari variabel, seperti kata kunci pencarian, lewatkan melalui preg_quote() dengan delimiter sebagai argumen kedua, kalau tidak 1+1 akan cocok dengan 11 dan / yang tidak di-escape merusak polanya.
Pola yang tidak valid tidak melempar exception. PHP mencetak warning dan preg_match() mengembalikan false:
Warning: preg_match(): No ending delimiter '/' found in /path/to/index.php on line 3
Jadi periksa === false (atau preg_last_error_msg()) saat polanya disusun saat runtime. Untuk pemeriksaan substring biasa tanpa pola sama sekali, str_contains() lebih cepat dan lebih jelas. Untuk mengubah teks yang cocok, pakai preg_replace().
Pertanyaan yang sering diajukan
Apa yang dikembalikan preg_match di PHP?
1 jika polanya cocok, 0 jika tidak, dan false jika polanya sendiri tidak valid. Karena 0 dan false sama-sama falsy, bandingkan dengan === 1 saat kamu perlu membedakan pola yang gagal dari tidak adanya kecocokan.
Bagaimana cara mendapatkan teks yang cocok dari preg_match?
Berikan argumen ketiga: preg_match('/(\d+)/', 'Order 4521', $m). Lalu $m[0] adalah seluruh kecocokan dan $m[1] adalah capture group pertama, keduanya "4521" di sini. Dengan named group (?<id>\d+), nilainya juga ada di $m['id'].
Apa perbedaan preg_match dan preg_match_all?
preg_match() berhenti di kecocokan pertama. preg_match_all() menemukan setiap kecocokan, mengembalikan jumlah yang ditemukannya, dan mengisi $matches dengan semuanya: preg_match_all('/\d+/', 'a1 b22 c333', $m) mengembalikan 3 dan $m[0] berisi ["1", "22", "333"].
Bagaimana cara memakai preg_match dengan teks Jepang atau teks UTF-8 lainnya?
Tambahkan modifier u: preg_match('/^.{3}$/u', '日本語') mengembalikan 1. Tanpa u, PHP memperlakukan string sebagai byte, jadi . cocok dengan satu byte dari karakter yang berukuran 3 byte. Dengan u, kamu juga bisa memakai kelas Unicode seperti \p{Han}, \p{Hiragana}, dan \p{Katakana}.
Bagaimana cara mengecek apakah sebuah string hanya berisi angka di PHP?
preg_match('/^\d+$/D', $s) atau, tanpa regex, ctype_digit($s). Modifier D (atau \z alih-alih $) itu penting: $ biasa juga menerima baris baru di akhir, jadi "123\n" akan lolos.