Fungsi String secara Mendalam

substr, str_replace, explode/implode, dan keluarga mb_* multibyte.

Daftar isi

Fungsi string bawaan PHP mencakup hampir seluruh kebutuhan pengolahan teks sehari-hari, mulai dari memotong, mengganti, memecah, sampai menyusun kembali. Topik ini membahas empat kelompok fungsi yang paling sering dipakai, yaitu substr, str_replace, explode beserta implode, dan keluarga mb_* untuk teks multibyte. Pada teks multibyte, satu karakter dapat tersimpan dalam lebih dari satu byte. Setelah membaca topik ini, pemilihan fungsi yang tepat untuk setiap tugas pengolahan string dapat dilakukan secara sadar, termasuk memahami kapan penghitungan byte dan karakter menghasilkan angka yang berbeda.

Memotong string dengan substr#

Fungsi substr mengembalikan bagian dari sebuah string berdasarkan posisi awal dan panjang yang diminta. Posisi dihitung mulai dari nol, sehingga offset 0 menunjuk karakter pertama. Apabila offset bernilai negatif, perhitungannya mundur dari akhir string. Parameter panjang bersifat opsional, dan tanpa parameter itu potongan berlanjut sampai akhir string. Nilai panjang negatif membuang sejumlah karakter dari akhir, sedangkan offset yang melebihi panjang string menghasilkan string kosong.

Empat pemanggilan berikut memperlihatkan perilaku tersebut satu per satu.

php
<?php

echo substr("ABCDE", 1, 3) . PHP_EOL;
echo substr("ABCDE", -3, 2) . PHP_EOL;
echo substr("laporan-2026-03", -2) . PHP_EOL;
echo substr("ABCDE", 10) . "|" . PHP_EOL;
text Keluaran
BCD
CD
03
|

Baris pertama mengambil tiga karakter mulai dari posisi 1, sehingga hasilnya BCD. Baris kedua memulai potongan pada karakter ketiga dari akhir string, yaitu tepat pada C, dan panjang 2 menghasilkan CD. Baris ketiga memanfaatkan offset negatif untuk mengambil dua karakter terakhir dari sebuah nama berkas. Baris keempat meminta potongan pada offset 10 yang tidak ada, sehingga keluarannya string kosong yang terlihat sebagai satu tanda garis vertikal.

Perilaku tersebut berbeda antarversi PHP. Sebelum PHP 8, substr mengembalikan false ketika offset berada di luar jangkauan, sedangkan sejak PHP 8 hasilnya string kosong. Kode lama yang membandingkan hasil substr dengan false perlu disesuaikan, dan pemeriksaan yang lebih jelas adalah membandingkan hasilnya dengan === '' untuk kondisi kosong.

Mengganti teks dengan str_replace#

Fungsi str_replace menggantikan seluruh kemunculan sebuah teks dengan teks penggantinya. Pencocokannya peka huruf besar dan kecil, sehingga Kopi dan kopi diperlakukan sebagai teks yang berbeda. String di PHP tidak dapat diubah nilainya secara langsung, sehingga fungsi ini mengembalikan string baru dan string asalnya tetap utuh. Parameter keempat yang bersifat opsional menerima variabel yang akan berisi jumlah penggantian yang terjadi.

php
<?php

$kalimat = "Es kopi hangat dan kopi tubruk";

echo str_replace("kopi", "teh", $kalimat) . PHP_EOL;
echo $kalimat . PHP_EOL;

$jumlah = 0;
$hasil = str_replace(",", ";", "a,b,c", $jumlah);
echo $hasil . " (" . $jumlah . " penggantian)" . PHP_EOL;
echo str_replace(["ini", "itu"], ["sini", "situ"], "ini dan itu") . PHP_EOL;
text Keluaran
Es teh hangat dan teh tubruk
Es kopi hangat dan kopi tubruk
a;b;c (2 penggantian)
sini dan situ

Baris pertama keluaran memperlihatkan kedua kemunculan kopi ikut tergantikan, sedangkan baris kedua membuktikan $kalimat tidak berubah. Baris ketiga menunjukkan parameter keempat terisi angka 2 karena terdapat dua koma yang digantikan. Baris keempat memakai bentuk array, yaitu teks pada posisi pertama array pencarian digantikan oleh teks pada posisi yang sama di array penggantinya.

Pencocokan yang tidak peka huruf besar dan kecil tersedia melalui fungsi kembar str_ireplace, yang parameter dan perilakunya sama persis dengan str_replace. Pada bentuk array, urutan kedua sisi harus selaras karena pasangan pencarian dan penggantian digabungkan menurut posisinya, bukan menurut namanya. Bentuk array ini menghemat pemanggilan ketika beberapa teks perlu digantikan sekaligus dalam satu langkah.

Memecah dan menyusun dengan explode dan implode#

Fungsi explode memecah sebuah string menurut pemisah tertentu dan mengembalikan array berisi potongan-potongannya. Fungsi ini cocok untuk membaca data berformat sederhana, misalnya satu baris nilai yang dipisahkan koma. Pasangannya adalah implode, yang menyusun elemen array menjadi satu string dengan penyambung tertentu, sehingga keduanya merupakan kebalikan satu sama lain. Parameter ketiga explode yang bersifat opsional membatasi jumlah elemen hasil, dan sisa string yang belum terpecah diletakkan pada elemen terakhir.

php
<?php

$baris = "Budi,17,XI RPL";
$kolom = explode(",", $baris);
print_r($kolom);

echo implode(" | ", $kolom) . PHP_EOL;
echo implode("-", [3, 1, 4, 1, 5]) . PHP_EOL;
print_r(explode(",", "a,b,c,d", 3));
text Keluaran
Array
(
    [0] => Budi
    [1] => 17
    [2] => XI RPL
)
Budi | 17 | XI RPL
3-1-4-1-5
Array
(
    [0] => a
    [1] => b
    [2] => c,d
)

Keluaran pertama memperlihatkan $baris terpecah menjadi tiga elemen menurut koma, dan spasi dalam XI RPL tidak ikut memecah karena pemisahnya hanyalah koma. Pemanggilan implode menyatukan kembali elemen tersebut dengan penyambung yang berbeda dari pemisah semula. Pemanggilan terakhir membatasi hasil pada tiga elemen, sehingga c,d tetap menyatu pada elemen ketiga.

Parameter pemisah tidak boleh berupa string kosong, dan PHP 8 menolaknya dengan ValueError karena tidak ada batas yang jelas untuk dipotong. Pemisah yang terdiri atas lebih dari satu karakter tetap diperbolehkan dan dicocokkan apa adanya, sehingga explode(", ", $daftar) hanya memecah pada koma yang diikuti spasi.

Byte dan karakter: keluarga mb_*#

Fungsi strlen dan substr menghitung panjang serta posisi dalam byte, bukan dalam karakter. Pada penyandian UTF-8, huruf Latin biasa memakai satu byte per karakter, sehingga "Jakarta" terhitung 7 byte sekaligus 7 karakter. Karakter di luar huruf Latin memakai dua sampai empat byte, sehingga string "こんにちは" yang berisi lima karakter Jepang tersimpan sebagai lima belas byte. Teks bahasa Indonesia umumnya beraksara ASCII, tetapi nama orang, judul, dan teks dari sumber luar dapat memuat karakter non-ASCII kapan saja.

Diagram berikut memperlihatkan bagaimana lima karakter Jepang tersebut tersimpan sebagai lima belas byte yang berurutan.

String "Jakarta": 7 byte = 7 karakter, satu byte per karakterString "こんにちは": 15 byte = 5 karakter, tiga byte per karakterE38193E38293E381ABE381A1E381AFこんにちはsubstr menghitung 15 byte, sedangkan mb_strlen menghitung 5 karakter.Empat byte pertama (e38193e3) memotong karakter kedua di tengah.
Perbandingan penyimpanan byte dan karakter pada UTF-8

Keluarga fungsi mb_* bekerja menurut karakter dengan membaca penyandian string, yang bawaannya adalah UTF-8. Fungsi mb_strlen menghitung karakter, mb_substr memotong tanpa memutus karakter di tengah, dan mb_strtoupper mengubah huruf sesuai aturan penyandiannya. Contoh berikut membandingkan kedua kelompok fungsi pada teks yang sama.

php
<?php

echo strlen("Jakarta") . " byte" . PHP_EOL;
echo mb_strlen("Jakarta") . " karakter" . PHP_EOL;
echo strlen("こんにちは") . " byte" . PHP_EOL;
echo mb_strlen("こんにちは") . " karakter" . PHP_EOL;

$potongan = substr("こんにちは", 0, 4);
echo bin2hex($potongan) . PHP_EOL;
echo mb_substr("こんにちは", 0, 2) . PHP_EOL;
echo strtoupper("Café") . PHP_EOL;
echo mb_strtoupper("Café") . PHP_EOL;
text Keluaran
7 byte
7 karakter
15 byte
5 karakter
e38193e3
こん
CAFé
CAFÉ

Empat baris pertama menegaskan perbedaan penghitungan pada teks Jepang, sedangkan "Jakarta" memberikan angka yang sama untuk keduanya. Baris e38193e3 adalah tampilan heksadesimal dari substr("こんにちは", 0, 4), yaitu tiga byte penuh milik karakter pertama ditambah satu byte awal karakter kedua yang terpotong. Fungsi bin2hex dipakai di sini agar byte yang rusak itu tercetak aman sebagai teks. Sebaliknya, mb_substr mengembalikan dua karakter utuh. Dua baris terakhir memperlihatkan strtoupper yang berbasis byte hanya mengubah huruf Latin sederhana sehingga é tetap kecil, sedangkan mb_strtoupper mengubahnya menjadi É.

Kombinasi explode dengan keluarga mb_* muncul pada tugas kecil berikut, yaitu membentuk inisial dari sebuah nama lengkap.

php inisial-nama.php
<?php

function buatInisial(string $namaLengkap): string
{
    $kata = explode(" ", trim($namaLengkap));
    $inisial = "";

    foreach ($kata as $satuKata) {
        if ($satuKata === "") {
            continue;
        }
        $inisial .= mb_strtoupper(mb_substr($satuKata, 0, 1));
    }

    return $inisial;
}

echo buatInisial("Budi Santoso") . PHP_EOL;
echo buatInisial("dewi lestari") . PHP_EOL;
echo buatInisial("Ali") . PHP_EOL;
text Keluaran
BS
DL
A

Fungsi buatInisial memecah nama menurut spasi, lalu mengambil satu karakter pertama dari setiap kata dengan mb_substr dan mengkapitalkannya dengan mb_strtoupper. Pemeriksaan $satuKata === "" menjaga agar spasi ganda tidak menghasilkan elemen kosong. Nama yang ditulis huruf kecil sekalipun menghasilkan inisial berhuruf kapital karena kapitalisasi terjadi di dalam fungsi.

Kesalahan umum#

Empat kesalahan berikut paling sering muncul saat mengolah string.

  • substr atau strlen dipakai pada teks UTF-8 yang memuat karakter non-ASCII dan hasilnya dianggap aman. Penghitungan berbasis byte dapat memutus karakter di tengah sehingga string hasil tidak valid. Perbaikannya adalah menggunakan mb_substr dan mb_strlen untuk teks dari sumber luar.
  • explode dipanggil dengan pemisah yang ternyata tidak ada dalam string. Hasilnya bukan array kosong, melainkan array berisi satu elemen string utuh, sehingga akses ke $kolom[1] memicu warning karena kunci tersebut tidak ada. Perbaikannya adalah memeriksa count($kolom) sebelum membaca elemennya.
  • Hasil str_replace dianggap mengubah string asalnya. String di PHP tidak dapat diubah nilainya secara langsung, sehingga penggantian yang tidak disimpan akan hilang. Perbaikannya adalah menampung nilai kembalian ke variabel, sebagaimana dilakukan pada contoh di atas.
  • Keluarga mb_* dipanggil tanpa memastikan ekstensi mbstring terpasang. Fungsi yang tidak ditemukan memicu error fatal dan program berhenti pada baris pemanggilannya. Perbaikannya adalah memeriksa ketersediaan ekstensi pada lingkungan sebelum memakai fungsi tersebut, karena mbstring terpasang pada hampir semua distribusi PHP modern.

Ringkasan#

  • substr memotong string menurut offset dan panjang, mendukung offset negatif dari akhir string, dan menghasilkan string kosong bila offset berada di luar jangkauan.
  • str_replace menggantikan seluruh kemunculan teks dan mengembalikan string baru, mendukung bentuk array, serta dapat melaporkan jumlah penggantian melalui parameter keempatnya.
  • explode memecah string menjadi array menurut pemisah, sedangkan implode menyusun array menjadi string dengan penyambung.
  • strlen dan substr menghitung byte, sedangkan mb_strlen dan mb_substr menghitung karakter, dan keluarga mb_* wajib dipakai untuk teks UTF-8 yang memuat karakter non-ASCII.

Referensi#