2024 日本 PHP 研討會

grapheme_extract

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

grapheme_extract從文字緩衝區中提取一系列預設字素叢集的函式,該緩衝區必須以 UTF-8 編碼

描述

程序式風格

grapheme_extract(
    字串 $haystack,
    整數 $size,
    整數 $type = GRAPHEME_EXTR_COUNT,
    整數 $offset = 0,
    整數 &$next = null
): 字串|false

從文字緩衝區中提取一系列預設字素叢集的函式,該緩衝區必須以 UTF-8 編碼。

參數

haystack

要搜尋的字串。

size

基於 type 參數要返回的最大項目數。

type

定義 size 參數所指的單位類型

  • GRAPHEME_EXTR_COUNT (預設) - size 是要提取的預設字素叢集的數量。
  • GRAPHEME_EXTR_MAXBYTES - size 是返回的最大位元組數。
  • GRAPHEME_EXTR_MAXCHARS - size 是返回的最大 UTF-8 字元數。

offset

haystack 中的起始位置(以位元組為單位) - 如果給定,它必須是零或一個小於或等於 haystack 長度(以位元組為單位)的正值,或一個從 haystack 末尾開始計算的負值。如果 offset 並非指向 UTF-8 字元的第一個位元組,則起始位置會移動到下一個字元邊界。

next

將設定為下一個起始位置的值的參考。當呼叫返回時,這可能會指向字串結尾之後的第一個位元組位置。

返回值

一個從偏移量 offset 開始並在符合指定的 sizetype 的預設字素叢集邊界處結束的字串,如果失敗則返回 false

更新日誌

版本 描述
7.1.0 已新增對負 offset 的支援。

範例

範例 #1 grapheme_extract() 範例

<?php

$char_a_ring_nfd
= "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) 正規化格式 "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) 正規化格式 "D"

print urlencode(grapheme_extract( $char_a_ring_nfd . $char_o_diaeresis_nfd, 1, GRAPHEME_EXTR_COUNT, 2));

?>

以上範例將輸出

o%CC%88

另請參閱

新增筆記

使用者貢獻的筆記 3 則筆記

5
AJH
13 年前
以下是如何使用 grapheme_extract() 逐字元循環 UTF-8 字串。

<?php

$str
= "سabcक’…";
// 如果上一行沒有顯示,則字串包含:
//U+0633,U+0061,U+0062,U+0063,U+0915,U+2019,U+2026

$n = 0;

for (
$start = 0, $next = 0, $maxbytes = strlen($str), $c = '';
$start < $maxbytes;
$c = grapheme_extract($str, 1, GRAPHEME_EXTR_MAXCHARS , ($start = $next), $next)
)
{
if (empty(
$c))
continue;
echo
"這個 utf8 字元長度為 " . strlen($c) . " 位元組,其第一個位元組為 " . ord($c[0]) . "\n";
$n++;
}
echo
"$n 個 UTF-8 字元在一個 $maxbytes 位元組的字串中!\n";
// 應該印出:7 個 UTF8 字元在一個 14 位元組的字串中!
?>
1
Philo
1 年前
此頁面上的其他評論對我很有幫助。
但是,在檢查 grapheme_extract 返回的值時,請考慮使用比 empty($value) 更好的方法,因為它也可能返回類似「0」的內容(當然會被評估為 false)。
1
yevgen dot grytsay at gmail dot com
4 年前
循環瀏覽字素叢集

<?php

// 範例取自 Rust 文件:https://doc.rust-lang.org/book/ch08-02-strings.html#bytes-and-scalar-values-and-grapheme-clusters-oh-my
$str = "नमस्ते";
// 或者:
//$str = pack('C*', ...[224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164, 224, 165, 135]);
$next = 0;
$maxbytes = strlen($str);

var_dump($str);

while (
$next < $maxbytes) {
$char = grapheme_extract($str, 1, GRAPHEME_EXTR_COUNT, $next, $next);
if (empty(
$char)) {
continue;
}
echo
"{$char} - 這個 utf8 字元長度為 " . strlen($char) . ' 位元組', PHP_EOL;
}

//string(18) "नमस्ते"
//न - 這個 utf8 字元長度為 3 位元組
//म - 這個 utf8 字元長度為 3 位元組
//स् - 這個 utf8 字元長度為 6 位元組
//ते - 這個 utf8 字元長度為 6 位元組
?>
To Top