grapheme_extract

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

grapheme_extract从文本缓冲区中提取默认图形簇序列的函数,文本缓冲区必须使用 UTF-8 编码

描述

过程式风格

grapheme_extract(
    string $haystack,
    int $size,
    int $type = GRAPHEME_EXTR_COUNT,
    int $offset = 0,
    int &$next = null
): string|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
"This utf8 character is " . strlen($c) . " bytes long and its first byte is " . ord($c[0]) . "\n";
$n++;
}
echo
"$n UTF-8 characters in a string of $maxbytes bytes!\n";
// 应该打印:字符串中包含 7 个 UTF-8 字符,共 14 个字节!
?>
1
Philo
9 个月前
此页面上的其他评论对我有帮助。
但是,请考虑使用比 empty($value) 更好的方法来检查 grapheme_extract 返回的值,因为它也可能返回诸如“0”之类的值(当然会评估为假)。
1
yevgen dot grytsay at gmail dot com
3 年前
循环遍历图形簇

<?php

// 示例取自 Rust 文档:https://doc.rust-lang.net.cn/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} - This utf8 character is " . strlen($char) . ' bytes long', PHP_EOL;
}

//string(18) "नमस्ते"
//न - This utf8 character is 3 bytes long
//म - This utf8 character is 3 bytes long
//स् - This utf8 character is 6 bytes long
//ते - This utf8 character is 6 bytes long
?>
To Top