PHP: Menghapus Tag HTML Tertentu Dari Tulisan

Di bahasa pemrograman PHP kita mengenal fungsi strip_tags() untuk menghapus seluruh tag HTML dari tulisan (string), kecuali tag-tag tertentu. Namun, bagaimana jika sebaliknya, kita ingin menghapus hanya tag-tag tertentu saja dari tulisan dan membiarkan sisanya? PHP tidak memiliki fungsi khusus untuk ini.

Tapi kita bisa buat sendiri menggunakan fungsi Regex (regular expression) yaitu preg_replace().

Regular Expression adalah sebuah format pola yang bisa digunakan untuk mencari dan mencocokkan pola tertentu dalam tulisan. Kita tahu bahwa tag HTML memiliki format contohnya seperti ini:

<p class="paragraf">Isi inner HTML dari tag</p>
<img src="gambar.png" />

Jika kita mau menghapus tag <p> saja, pola Regex dan kodenya adalah sebagai berikut:

<?php
$html = <<<EOF
<p class="paragraf">Isi inner HTML dari tag</p>
<img src="gambar.png" />
EOF;
$hasil = preg_replace('#</?p.*?>#is', '', $html);
echo $hasil;

Hasilnya:

Isi inner HTML dari tag
<img src=”gambar.png” />

Penjelasan

Fungsi preg_replace() mirip dengan str_replace(). Bedanya fungsi ini menerima input berupa pola Regex, teks penggantinya, dan string yang akan diubah.

Pola Regex harus diapit oleh simbol pembuka dan penutup. Simbol ini bisa berupa karakter apa saja, walaupun pada umumnya menggunakan tanda garis miring (/). Tapi karena kode HTML mengandung garis miring, kita ganti menggunakan tanda pagar (#). Apa yang berada di antara kedua tanda pagar # ini adalah pola yang akan dicocokkan.

Berikut ini penjabarannya:

  • < sebagai karakter pembuka tag.
  • /? tanda tanya artinya karakter ini (garis miring) boleh ada atau tidak.
  • p selanjutnya, karena kita ingin menghapus tag <p>, maka kita tulis tag p disini
  • .*? berarti cocokkan karakter apa saja (titik) sebanyak 0 atau lebih karakter (bintang) hingga menemukan karakter setelahnya (tanda tanya)
  • > adalah karakter yang dicocokkan setelahnya

Kemudian setelah tanda akhir Regex, kita beri modifier i yang berarti case-insensitive dan s yang berarti multi-line.

Jika pola ini cocok, maka akan diganti menjadi teks kosong.

Pola Regex ini akan cocok dengan tulisan seperti ini misalnya:

  • <p>
  • <P CLASS="paragraph">
  • </p>

Menghapus lebih dari satu jenis tag

Bagaimana jika ingin menghapus banyak jenis tag sekaligus?

Misalnya, kita ingin menghapus tag <p> dan <img>. Ubah pola regex-nya menjadi:

preg_replace('#</?(p|img).*?>#is', '', $html);

Bonus: Membuat fungsi strip_only_tags()

Oke, sekarang kita sudah bisa menghapus tag, mari kita buat kode ini menjadi fungsi agar lebih mudah digunakan. Kita namakan fungsinya strip_only_tags()

function strip_only_tags($str, $stripped_tags = null) {
  // Tidak ada tag yang dihapus
  if ($stripped_tags == null) {
    return $str;
  }
  // Dapatkan daftar tag
  // Misal: <b><i><u> menjadi array('b','i','u')
  $tags = explode('>', str_replace('<', '', $stripped_tags));
  $result = preg_replace('#</?(' . implode('|', $tags) . ').*?>#is', '', $str);
  return $result;
}

// Contoh penggunaan
$html = <<<EOF
<p class="paragraf">Isi inner HTML dari tag</p>
<img src="gambar.png" />
EOF;
$hasil = strip_only_tags($html, '<p><img>');
echo $hasil;

Output:

Isi inner HTML dari tag

Tulis Komentar