Apabila memadankan rentetan UTF-8 menggunakan preg_match() dengan parameter PREG_OFFSET_CAPTURE, pengguna mungkin menghadapi masalah yang tidak dijangka tingkah laku di mana offset dikira dalam bait dan bukannya aksara. Walaupun menggunakan pengubah suai u, yang membolehkan sokongan UTF-8 untuk kedua-dua corak dan subjek, ofset yang ditangkap kekal berasaskan bait.
Untuk menangani percanggahan ini dan dapatkan offset berasaskan aksara, penyelesaian yang melibatkan mb_strlen boleh digunakan. Fungsi ini menyediakan kiraan aksara UTF-8 untuk subrentetan tertentu. Dengan menggunakan mb_strlen pada subrentetan rentetan subjek sebelum padanan yang dirakam, kami boleh mendapatkan offset aksara yang tepat.
Berikut ialah contoh yang diubah suai:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1])); // Outputs 1
Dengan memasukkan mb_strlen, kami memastikan bahawa offset mewakili kedudukan aksara dalam rentetan UTF-8, memberikan hasil yang tepat dan dijangka.
Atas ialah kandungan terperinci Mengapakah preg_match() Offset dalam Bait, Bukan Aksara, Walaupun dengan Sokongan UTF-8?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!