Regex Dasar dengan preg_match
Kuasai pola pencarian teks: validasi format, ekstrak data, dan ganti massal.
Analogi: Metal Detector
Mencari "nomor HP" dalam tumpukan teks dengan strpos seperti mencari koin dengan tangan kosong: kamu harus tahu persis bentuknya. Regex (regular expression) seperti metal detector yang bisa diatur: "bunyi kalau ketemu pola 08 diikuti 8-12 digit". Sekali paham polanya, kamu bisa menemukan apa pun yang berpola.
Regex dipakai PHP lewat fungsi preg_*: preg_match (apakah cocok?), preg_match_all (ambil semua yang cocok), preg_replace (ganti yang cocok).
<?php
// Contoh 1: anatomi pola, bagian per bagian
$pola = "/^08[0-9]{8,12}$/";
// | | | | |
// | | | | +-- $ : akhir string
// | | | +-- {8,12} : 8 sampai 12 kali
// | | +-- [0-9] : satu digit
// | +-- 08 : teks harfiah "08"
// +-- ^ : awal string; / : pembatas pola
var_dump((bool) preg_match($pola, "081234567890")); // true
var_dump((bool) preg_match($pola, "08123")); // false: terlalu pendek
var_dump((bool) preg_match($pola, "xx081234567890")); // false: ada awalanTiga simbol super: ^$ (jangkar awal/akhir), [ ] (pilihan karakter), {n,m} (jumlah). Kuasai tiga ini dan 70% kebutuhan regex tertutup.
<?php
// Contoh 2: grup tangkap dan pola praktis
// Ekstrak tanggal dari teks dengan grup (tanda kurung)
preg_match("/(\d{4})-(\d{2})-(\d{2})/", "Lahir 2008-05-21 ya", $m);
echo "Tahun: {$m[1]}, Bulan: {$m[2]}, Tanggal: {$m[3]}";
// $m[0] = seluruh yang cocok, $m[1..] = isi tiap kurung
// Pola siap pakai sehari-hari:
$username = "sinta_17";
var_dump((bool) preg_match("/^[a-z0-9_]{5,15}$/i", $username)); // true (i = abaikan kapital)
$kode = "TRX-2026-001";
var_dump((bool) preg_match("/^TRX-\d{4}-\d{3}$/", $kode)); // true: \d = digitKurung ( ) menangkap bagian pola agar bisa dipakai ulang via $m[1], $m[2]. Shortcut \d (digit), \w (huruf/angka/underscore), \s (spasi) menghemat penulisan [0-9] manual.
Jebakan yang Sering Terjadi
Lupa delimiter dan modifier. Pola regex PHP wajib diapit pembatas (/.../, #...#). preg_match("^[0-9]+$", ...) tanpa pembatas langsung error. Modifier seperti i (case-insensitive) ditulis setelah pembatas tutup: /pola/i.
Regex untuk semua hal. Regex hebat untuk pola, buruk untuk struktur: jangan parse HTML/JSON/URL kompleks dengan regex (pakai parser). Aturan: kalau polanya butuh "menghitung" kurung buka-tutup, regex bukan alatnya.
Studi Kasus: Ekstrak Data
Regex bersinar saat menambang data dari teks tidak terstruktur:
<?php
$teks = "Hubungi 081234567890 atau 089876543210, email [email protected]";
// Ambil semua nomor HP
preg_match_all('/08\d{8,12}/', $teks, $hp);
print_r($hp[0]); // ["081234567890", "089876543210"]
// Ambil semua email
preg_match_all('/[\w.]+@[\w.]+\.\w+/', $teks, $email);
print_r($email[0]); // ["[email protected]"]
// Pecah dengan banyak pemisah sekaligus
$baris = "apel, mangga;jeruk|anggur";
print_r(preg_split('/[,;|]/', $baris)); // 4 buah terpisahpreg_split adalah explode versi regex: pecah dengan banyak pemisah sekaligus. Pola email di atas versi sederhana (cukup untuk 99% kasus); validasi email final tetap pakai filter_var.
Catatan teknis: Fungsi
preg_quote($teks)meng-escape karakter spesial regex dalam teks dinamis. Wajib dipakai saat pola mengandung input user, misalnya mencari kata yang diketik user:"/" . preg_quote($kata, "/") . "/i".
Tantangan
Validator kode voucher
Buat fungsi validVoucher(string $kode): bool yang mengembalikan true hanya jika kode cocok pola VCR-XXXX-2026 (X = huruf kapital A-Z atau digit, tepat 4 karakter). Gunakan preg_match dengan anchor.
Kuis Bab
Uji pemahamanmu: Bab 5: Utilitas Data
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Method apa yang dipakai untuk menambah 7 hari ke objek DateTime?
2.Apa efek parameter true pada json_decode($json, true)?
3.Apa output dari echo json_encode(["a" => 1]); ?
4.Apa arti simbol ^ dan $ dalam pola regex?
5.Bagaimana cara tahu json_decode gagal karena JSON rusak?