regexstringvalidasiMenengah4 mnt baca

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
<?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 awalan

Tiga simbol super: ^$ (jangkar awal/akhir), [ ] (pilihan karakter), {n,m} (jumlah). Kuasai tiga ini dan 70% kebutuhan regex tertutup.

php
<?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 = digit

Kurung ( ) 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
<?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 terpisah

preg_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?