Aplikasi web terus-menerus memeriksa isi teks: apakah alamat email memuat tanda @, apakah nama berkas berakhiran .pdf, atau di manakah posisi sebuah kata dalam kalimat. PHP menyediakan tiga lapis alat untuk kebutuhan tersebut — fungsi jawaban ya/tidak, fungsi pencari posisi, dan versi multibyte untuk teks UTF-8. Pada Chapter ini kita akan memakai ketiganya, membongkar jebakan klasik pencarian di posisi nol, lalu menutup dengan cara menghitung jumlah kemunculan sebuah teks.

Pencarian Boolean dengan str_contains, str_starts_with, dan str_ends_with #

PHP 8.0 memperkenalkan tiga fungsi pencarian yang paling mudah dipakai karena langsung mengembalikan bool: str_contains() memeriksa apakah sebuah teks ada di dalam string, str_starts_with() memeriksa awalan, dan str_ends_with() memeriksa akhiran. Ketiganya peka terhadap kapitalisasi huruf — "php" tidak akan cocok dengan "PHP".

php
<?php
$email = "[email protected]";

var_dump(str_contains($email, "@"));
var_dump(str_starts_with($email, "budi"));
var_dump(str_ends_with($email, ".com"));

Output yang Dihasilkan:

text
bool(true)
bool(true)
bool(true)

Ketiga pemeriksaan mengembalikan bool(true) karena tanda @ memang ada di tengah alamat, teks diawali budi, dan diakhiri .com. Untuk kasus yang tidak cocok, hasilnya cukup jelas bool(false), seperti contoh berikut:

php
<?php
$laporan = "laporan-2026.pdf";
$catatan = "catatan-rapat.txt";

var_dump(str_ends_with($laporan, ".pdf"));
var_dump(str_ends_with($catatan, ".pdf"));

Output yang Dihasilkan:

text
bool(true)
bool(false)

Fungsi akhiran seperti ini adalah cara paling tepat memeriksa ekstensi berkas karena membaca ujung string apa adanya, tanpa aturan pola khusus. Nama variabel pun tidak perlu dihitung panjangnya — kita hanya bertanya ya atau tidak, dan jawabannya sudah berupa boolean yang siap dipakai.

Mencari Posisi dengan strpos #

Kadang kita tidak cukup tahu bahwa teks ada; kita perlu tahu di mana ia berada — misalnya untuk memotong string di sekitar posisi tersebut. Fungsi strpos() mengembalikan posisi byte pertama tempat teks ditemukan, atau false bila teks tidak ada sama sekali. Posisi dihitung mulai dari nol.

php
<?php
$kalimat = "Belajar PHP itu menyenangkan";

$posisi = strpos($kalimat, "PHP");

echo "Ditemukan di posisi: $posisi\n";
var_dump($posisi !== false);

Output yang Dihasilkan:

text
Ditemukan di posisi: 8
bool(true)

Kata "PHP" ditemukan di posisi 8 karena delapan karakter mendahuluinya: Belajar (tujuh huruf) plus satu spasi. Perhatikan pemakaian perbandingan !== false — bukan sekadar pemeriksaan kebenaran — dan itu bukan kebetulan, sebagaimana akan kita lihat sebentar lagi. Ketika teks tidak ditemukan, strpos() mengembalikan false:

php
<?php
$kalimat = "Belajar PHP itu menyenangkan";

$posisi = strpos($kalimat, "Python");

var_dump($posisi);

Output yang Dihasilkan:

text
bool(false)

Jebakan Posisi Nol #

Nilai kembalian strpos() berupa int saat ketemu dan bool false saat tidak — kombinasi inilah sumber jebakan paling terkenal di PHP. Bila teks yang dicari justru berada di posisi nol, angka 0 bernilai falsy sehingga perbandingan longgar menipu kita seolah-olah teks tidak ditemukan.

php
<?php
$namaBerkas = "catatan-harian.txt";

$posisi = strpos($namaBerkas, "catatan");

var_dump($posisi == false);  // true — padahal teks ditemukan
var_dump($posisi !== false); // true — pemeriksaan yang benar

Output yang Dihasilkan:

text
bool(true)
bool(true)

Kata "catatan" memang ada, tepat di posisi 0. Perbandingan $posisi == false mengembalikan true karena 0 dianggap sama dengan false oleh perbandingan longgar — keputusan yang keliru bila maksud kita adalah “teks tidak ditemukan”. Perbandingan ketat !== false membedakan int 0 dari bool false, sehingga menjadi satu-satunya cara yang benar.

Variasi Pencarian dengan stripos dan strrpos #

Dua saudara strpos() menutup kebutuhan lain. stripos() mencari tanpa memedulikan kapitalisasi, sedangkan strrpos() mencari kemunculan terakhir dari sebuah teks:

php
<?php
$kalimat = "PHP cepat, PHP populer, PHP gratis";

var_dump(stripos($kalimat, "php"));
var_dump(strrpos($kalimat, "PHP"));

Output yang Dihasilkan:

text
int(0)
int(24)

stripos() mengembalikan int(0) karena huruf kecil "php" cocok dengan "PHP" di awal kalimat — perbandingan dilakukan atas nama huruf, bukan nilai bytenya. strrpos() mengembalikan int(24) karena yang dicari adalah "PHP" terakhir, yaitu kata ketiga, bukan yang pertama di posisi 0. Kombinasi strrpos() dan substr() adalah resep klasik mengambil ekstensi berkas:

php
<?php
$berkas = "backup/laporan/bulanan.txt";

$posisiTitik = strrpos($berkas, ".");
$ekstensi = substr($berkas, $posisiTitik + 1);

echo "Ekstensi: $ekstensi\n";

Output yang Dihasilkan:

text
Ekstensi: txt

Kita mencari titik terakhir — bukan pertama — karena nama berkas seperti catatan.v2.txt boleh memuat banyak titik; ekstensi selalu berada setelah titik paling kanan. substr() lalu mengambil potongan mulai satu karakter setelah posisi titik hingga akhir string, menghasilkan txt.

Pencarian Multibyte dengan mb_strpos #

Sesuai model byte dari Chapter String Length dan Encoding , strpos() melaporkan posisi dalam satuan byte. Untuk teks yang memuat karakter multibyte, angka tersebut lebih besar daripada hitungan karakter yang kita bayangkan. Fungsi mb_strpos() mendekode string sebagai UTF-8 dan melaporkan posisi dalam satuan karakter:

php
<?php
$kata = "ações";

var_dump(strpos($kata, "e"));
var_dump(mb_strpos($kata, "e"));

Output yang Dihasilkan:

text
int(5)
int(3)

Huruf e berada di byte ke-5 karena ç dan õ masing-masing menempati dua byte (a satu byte, ç dua, õ dua — total lima sebelum e). Menurut hitungan karakter, e adalah karakter keempat sehingga mb_strpos() mengembalikan 3. Angka dari mb_strpos() amat penting bila posisi akan dipakai memotong string: pasangkan selalu mb_strpos() dengan mb_substr(), bukan substr().

Menghitung Kemunculan dengan substr_count #

Pertanyaan terakhir yang sering muncul adalah “berapa kali teks ini muncul?”. Fungsi substr_count() menghitung jumlah kemunculan sebuah potongan teks di dalam string:

php
<?php
$kalimat = "makan nasi padang sambil memasak";

echo substr_count($kalimat, "an") . "\n";
echo substr_count("aaaa", "aa") . "\n";

Output yang Dihasilkan:

text
2
2

Pasangan "an" muncul dua kali — di dalam kata makan dan padang — meski kalimatnya panjang. Contoh kedua memperlihatkan sifat penting: penghitungan tidak tumpang tindih. String "aaaa" memuat "aa" dua kali (posisi 0 dan 2), bukan tiga, karena setiap temuan langsung dikonsumsi dan pemindaian lanjut setelahnya. Perhitungan ini berguna mulai dari analisis teks sederhana sampai memvalidasi bahwa sebuah placeholder memang terisi.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh chapter ini dalam satu program utuh yang dapat langsung Anda jalankan.

Ringkasan #

Tabel berikut merangkum perangkat pencarian yang sudah kita kuasai:

FungsiMengembalikanKegunaan
str_contains()boolapakah teks ada di dalam string
str_starts_with()boolapakah string diawali teks tertentu
str_ends_with()boolapakah string diakhiri teks tertentu
strpos() / stripos() / strrpos()int | falseposisi byte pertama / tanpa peduli kapital / terakhir
mb_strpos()int | falseposisi karakter untuk teks UTF-8
substr_count()intjumlah kemunculan teks

Mencari adalah separuh pekerjaan; separuh sisanya adalah mengganti teks yang ditemukan. Kita akan mengerjakannya pada Chapter Replacing Text dengan str_replace(), strtr(), dan kawan-kawannya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php

// Mencari teks di dalam string

$email = "[email protected]";
var_dump(str_contains($email, "@"));
var_dump(str_ends_with($email, ".com"));

$kalimat = "Belajar PHP itu menyenangkan";
$posisi = strpos($kalimat, "PHP");
echo "Kata PHP ditemukan di posisi: $posisi\n";

$berkas = "backup/laporan/bulanan.txt";
$ekstensi = substr($berkas, strrpos($berkas, ".") + 1);
echo "Ekstensi berkas: $ekstensi\n";

echo "Jumlah kemunculan \"an\": " . substr_count("makan nasi padang", "an") . "\n";