首頁 >後端開發 >php教程 >為什麼 preg_match() 偏移量以位元組為單位,而不是字符,即使支援 UTF-8?

為什麼 preg_match() 偏移量以位元組為單位,而不是字符,即使支援 UTF-8?

DDD
DDD原創
2024-12-06 05:35:19161瀏覽

Why are preg_match() Offsets in Bytes, Not Characters, Even with UTF-8 Support?

PREG_OFFSET_CAPTURE 和UTF-8 字串:字節計數不符

使用preg_match() 與PREG_OFFSET_CAPTURE 參數匹配UTF-8 字串時,用戶可能會遇到到意外的情況偏移量以位元組而不是字元計算的行為。儘管使用了 u 修飾符,它為模式和主題啟用了 UTF-8 支持,但捕獲的偏移量仍然基於位元組。

解決位元組計數問題

要解決此差異並取得基於字元的偏移量,可以採用涉及 mb_strlen 的解決方法。此函數提供指定子字串的 UTF-8 字元計數。透過在捕獲的匹配項之前的主題字串的子字串上使用 mb_strlen,我們可以獲得準確的字元偏移量。

這是一個修改後的範例:

$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

透過合併 mb_strlen,我們確保偏移量表示 UTF-8 字串中的字元位置,提供精確且預期的結果。

以上是為什麼 preg_match() 偏移量以位元組為單位,而不是字符,即使支援 UTF-8?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn