Agar dash/hyphen tidak ikut terambil saat angka tidak ditemukan di preg_match

Saya sedang mencoba mengambil angka dari sebuah string menggunakan regex preg_match, tapi ada masalah ketika angka kedua setelah dash tidak ada, maka dash tersebut ikut terambil apabila ada spasi atau huruf setelahnya.

$gabung = '';
if (preg_match('/(?<=buku)[\s\d]+-?[\s\d]+/i', $dicari, $matches)) {
	if (stripos($matches[0], ' ') && strpos($matches[0], '-')) {
		$hapus_spasi = str_replace(' ', '', $matches[0]);
		$gabung.= 'b' . $hapus_spasi;
	}
	else {
        $hapus_spasi = str_replace(' ', '', $matches[0]);
        $gabung.= 'b' . $hapus_spasi;
    }
    echo $gabung;
}

yang diharapkan: 1. "buku 1 - " = "buku 1" 2. "buku 1 - abcd" = "buku 1" 3. "buku 1 - 3" = "buku 1-3"

yang terjadi: 1. buku 1- ("-" Dash ikut terambil) 2. buku 1- ("-" Dash ikut terambil) 3. buku 1-3 (Berhasil)

Saya tidak terbiasa dengan regex, jadi mohon untuk bantuannya jika bisa dijelaskan kesalahan saya diatas juga.

avatar Yuuzan
@Yuuzan

9 Kontribusi 1 Poin

Diperbarui 4 tahun yang lalu

Tanggapan

isinya $dicari dan $matches seperti apa gan?

isi $dicari dan $matches bisa dilihat di bagian "yang diharapkan" seperti "buku 1 - abc (ada di variable $dicari) = buku 1 ($matches)"

1 Jawaban:

Hi bro @Yuuzan,

Mungkin regex simple ini dapat membantu: <pre> preg_match('/buku.+(?=\d).(?!\w))/', $string, $matches); </pre> penjelasan:

  • buku: match kata buku
  • .+: match character sampai delimiter
  • (?=\d): Positive Lookahead, artinya match character sampai ketemu delimiter \d (character angka)
  • .(?!\w): sambung lagi sama Negative Lookahead, sampai ketemu delimiter \w (character huruf)

Regards_

avatar apake1
@apake1

106 Kontribusi 55 Poin

Dipost 4 tahun yang lalu

Login untuk ikut Jawaban