Dapatkan Kiraan Aksara Berbilang Bait Sebelum Perlawanan dengan preg_match()
Masalah:
Apabila membuat persembahan padanan ungkapan biasa pada rentetan yang dikodkan UTF-8 menggunakan preg_match() dengan Parameter PREG_OFFSET_CAPTURE, pengimbangan yang terhasil dikira dalam bait, bukan kiraan aksara. Ini boleh menjadi masalah apabila memadankan aksara berbilangbait, kerana panjang baitnya mungkin berbeza daripada panjang aksaranya.
Sebagai contoh, menggunakan kod berikut untuk memadankan aksara "H" dalam rentetan yang dikodkan UTF-8, yang terhasil offset ialah 2, walaupun aksara "H" berada pada indeks 1:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo $a_matches[0][1];
Resolusi:
Untuk mendapatkan pengimbangan kiraan aksara yang betul, gunakan mb_strlen() untuk menentukan panjang subrentetan sehingga padanan:
$str = "\xC2\xA1Hola!"; preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE); echo mb_strlen(substr($str, 0, $a_matches[0][1]));
Ini akan mengira offset dalam aksara UTF-8, memberikan hasil yang betul.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Offset Aksara yang Betul dalam Rentetan UTF-8 Selepas preg_match() dengan PREG_OFFSET_CAPTURE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!