Rumah >pembangunan bahagian belakang >tutorial php >Bagaimanakah Saya Boleh Mengendalikan Offset Aksara UTF-8 dengan `preg_match()` dan `PREG_OFFSET_CAPTURE` PHP?

Bagaimanakah Saya Boleh Mengendalikan Offset Aksara UTF-8 dengan `preg_match()` dan `PREG_OFFSET_CAPTURE` PHP?

Barbara Streisand
Barbara Streisandasal
2024-12-03 02:24:09650semak imbas

How Can I Correctly Handle UTF-8 Character Offsets with PHP's `preg_match()` and `PREG_OFFSET_CAPTURE`?

PREG_OFFSET_CAPTURE dan Watak Multibait: Mengatasi Percanggahan Kiraan

Apabila menggunakan preg_match() dengan pengubah suai u, kedua-dua corak dan subjek ditafsirkan sebagai UTF-8 dikodkan. Walau bagaimanapun, ofset yang ditangkap masih dikira dalam bait, walaupun dengan pengubah suai ini. Percanggahan ini boleh menyebabkan kekeliruan apabila menjangkakan indeks berasaskan aksara UTF-8.

Sifat PHP Mengira Bait dalam PREG_OFFSET_CAPTURE

Walaupun preg_match() merawat aksara Unicode, PREG_OFFSET_CAPTURE masih dilaksanakan dengan mekanisme pengiraan bait. Ini bermakna aksara dengan perwakilan multibait, seperti UTF-8, dikira sebagai bait individu dan bukannya aksara komposit.

Penyelesaian: Menggunakan mb_strlen

Untuk mendapatkan yang sesuai indeks berasaskan aksara dalam rentetan UTF-8, anda boleh memanfaatkan fungsi mb_strlen(). Fungsi ini boleh memberikan panjang rentetan UTF-8 dalam aksara. Dengan memasukkan ini ke dalam kod anda, anda boleh menterjemahkan offset berasaskan bait daripada PREG_OFFSET_CAPTURE ke dalam indeks aksara UTF-8 yang sepadan:

$str = "\xC2\xA1Hola!";
preg_match('/H/u', $str, $a_matches, PREG_OFFSET_CAPTURE);
echo mb_strlen(substr($str, 0, $a_matches[0][1])); // Output: 1

Dalam contoh ini, mb_strlen() mengira panjang aksara rentetan ke atas kepada offset yang diperoleh daripada PREG_OFFSET_CAPTURE, dengan itu memberikan indeks UTF-8 yang betul. Penyelesaian ini memastikan pengiraan aksara yang tepat, seperti yang dijangkakan apabila bekerja dengan rentetan Unicode.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Offset Aksara UTF-8 dengan `preg_match()` dan `PREG_OFFSET_CAPTURE` PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn