strpos($haystack, $needle) mengembalikan posisi $needle pertama di dalam $haystack, dihitung dari 0, atau false kalau tidak ada. Selalu periksa hasilnya dengan !== false, karena kecocokan di awal string mengembalikan 0.
Kalau di PHP 8 kamu hanya butuh jawaban ya atau tidak, str_contains() lebih jelas. Pakai strpos() kalau posisinya penting.
Sintaks
strpos(string $haystack, string $needle, int $offset = 0): int|false
Pencariannya peka huruf besar kecil. $offset menentukan dari mana pencarian dimulai; offset negatif dihitung dari akhir string.
Jebakan !== false
0 dan false dianggap sama pada perbandingan longgar (==). Karena itu, kecocokan di posisi 0 dianggap "tidak ditemukan" oleh pemeriksaan apa pun yang tidak ketat.
Aturan yang sama berlaku untuk stripos(), strrpos(), dan array_search(), yang semuanya bisa mengembalikan 0 untuk kecocokan yang sebenarnya.
Pencarian tanpa peka huruf besar kecil dengan stripos
stripos() menerima argumen yang sama dan mengabaikan huruf besar kecil pada huruf ASCII.
Mencari kemunculan terakhir dengan strrpos
strrpos() mengembalikan posisi kecocokan terakhir. Inilah cara standar untuk mendapatkan ekstensi file atau bagian terakhir sebuah path.
Khusus untuk nama file, pathinfo($file, PATHINFO_EXTENSION) sudah melakukannya untukmu. Cara memotong string di posisi tertentu dibahas di halaman substr().
Memulai pencarian dari sebuah offset
Argumen ketiga melewati bagian awal string. Offset negatif memulai pencarian sejumlah karakter itu sebelum akhir string.
Menemukan semua kemunculan
strpos() hanya menemukan satu kecocokan. Pakai loop dan geser offset melewati setiap kecocokan untuk menemukan semuanya:
Hanya butuh jumlahnya? substr_count($text, 'the') lebih singkat. Untuk pola, preg_match_all() dengan PREG_OFFSET_CAPTURE mengembalikan setiap kecocokan beserta posisinya.
Teks Jepang: posisi byte vs posisi karakter
strpos() menemukan teks multibyte dengan benar, tetapi angka yang dikembalikannya dalam byte. Kana dan kanji umum masing-masing memakai 3 byte di UTF-8, jadi pada teks yang seluruhnya berbahasa Jepang, posisi byte adalah tiga kali posisi karakter, dan pada teks campuran keduanya bergeser dengan cara yang tidak terlalu kelihatan. mb_strpos() mengembalikan posisi dalam karakter, dan itulah yang diharapkan mb_substr().
Mencampur keduanya adalah bug klasik: memberikan hasil strpos() ke mb_substr() membuat potongannya dimulai terlalu jauh ke dalam string. Pakai strpos dengan substr, dan mb_strpos dengan mb_substr.
Pertanyaan yang sering diajukan
Apa yang dikembalikan strpos() di PHP?
Posisi kecocokan pertama sebagai integer, dihitung dari 0, atau false kalau needle tidak ditemukan. strpos('hello', 'l') mengembalikan 2.
Kenapa strpos() perlu dicek dengan !== false?
Karena kecocokan di posisi paling awal mengembalikan 0, dan 0 == false bernilai true. if (strpos($s, 'a')) menganggap kecocokan di posisi 0 sebagai "tidak ditemukan". Selalu bandingkan dengan strpos($s, 'a') !== false.
Apa bedanya strpos, stripos, dan strrpos?
strpos() mencari kecocokan pertama dan peka huruf besar kecil. stripos() mencari kecocokan pertama tanpa memedulikan huruf besar kecil. strrpos() mencari kecocokan terakhir. strripos() mencari kecocokan terakhir tanpa memedulikan huruf besar kecil.
Sebaiknya pakai strpos atau str_contains untuk memeriksa apakah string mengandung teks?
Di PHP 8, pakai str_contains($haystack, $needle), yang mengembalikan true atau false biasa dan tidak punya jebakan posisi 0. Pakai strpos() kalau kamu memang butuh posisinya.
Bagaimana cara memakai strpos dengan teks Jepang?
strpos() menemukan teks Jepang dengan benar, tetapi mengembalikan posisi dalam byte. Kalau posisinya kamu berikan ke mb_substr() atau kamu tampilkan ke pengguna, pakai mb_strpos(), yang mengembalikan posisi dalam karakter.