PREG_OFFSET_CAPTURE 和多字節字元:克服計數差異
當使用帶有u 修飾符的preg_match() 時,模式和主題都被解釋為UTF-8 編碼。但是,即使使用此修飾符,捕獲的偏移量仍然以位元組為單位進行計數。當期望基於 UTF-8 字元的索引時,這種差異可能會導致混亂。
PHP 在 PREG_OFFSET_CAPTURE 中計算位元組的本質
儘管 preg_match() 處理 Unicode 字元, PREG_OFFSET_CAPTURE 仍然是透過位元組計數機製實現的。這意味著具有多位元組表示形式的字元(例如 UTF-8)將被計為單一位元組而不是複合字元。
解決方案:利用 mb_strlen
來取得適當的UTF-8 字串中基於字元的索引,您可以利用 mb_strlen() 函數。此函數可以提供 UTF-8 字串的字元長度。透過將其合併到程式碼中,您可以將PREG_OFFSET_CAPTURE 中基於位元組的偏移量轉換為對應的UTF-8 字元索引:
$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
在此範例中,mb_strlen() 計算字串的字元長度到從PREG_OFFSET_CAPTURE 獲得的偏移量,從而提供正確的UTF-8 索引。此解決方法可確保準確的字元計數,如使用 Unicode 字串時所期望的那樣。
以上是如何使用 PHP 的 `preg_match()` 和 `PREG_OFFSET_CAPTURE` 正確處理 UTF-8 字元偏移?的詳細內容。更多資訊請關注PHP中文網其他相關文章!