使用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中文網其他相關文章!