Here's how to use grapheme_extract() to loop across a UTF-8 string character by character.
<?php
$str = "سabcक’…";
// if the previous line didn't come through, the string contained:
//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";
// Should print: 7 UTF8 characters in a string of 14 bytes!
?>grapheme_extract
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
grapheme_extract
Референца за `function.grapheme-extract.php` со подобрена типографија и навигација.
grapheme_extract
Класата Collator
grapheme_extract — Функција за извлекување низа од стандардни графеми од бафер со текст, кој мора да биде кодиран во UTF-8
= NULL
Процедурален стил
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 знаци.
- GRAPHEME_EXTR_COUNT (стандардно) -
offset-
Почетна позиција во
haystackво бајти - ако е дадено, мора да биде нула или позитивна вредност што е помала или еднаква на должината наhaystackво бајти, или негативна вредност што брои од крајот наhaystack. Акоoffsetне покажува на првиот бајт од UTF-8 знак, почетната позиција се поместува до следната граница на знак. next-
Референца до вредност што ќе биде поставена на следната почетна позиција. Кога повикот ќе се врати, ова може да покажува на првата бајт позиција по крајот на низата.
Вратени вредности
Низа што започнува од поместување offset и завршува на граница на стандардна графема што одговара на size and type специфицирано, или false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 7.1.0 |
се генерира грешка на ниво на Windows, а од PHP 7.4 и на други оперативни системи. offsetПоддршката за негативни
|
Примери
Пример #1 grapheme_extract() example
<?php
$char_a_ring_nfd = "a\xCC\x8A"; // 'LATIN SMALL LETTER A WITH RING ABOVE' (U+00E5) normalization form "D"
$char_o_diaeresis_nfd = "o\xCC\x88"; // 'LATIN SMALL LETTER O WITH DIAERESIS' (U+00F6) normalization form "D"
print urlencode(grapheme_extract( $char_a_ring_nfd . $char_o_diaeresis_nfd, 1, GRAPHEME_EXTR_COUNT, 2));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
o%CC%88
Белешки од корисници 3 белешки
The other comments on this page were helpful for me.
However, consider using something better than empty($value) when checking the value returned by grapheme_extract since it could as well return something like "0" (which of course evaluates to false).Looping through grapheme clusters:
<?php
// Example taken from Rust documentation: https://doc.rust-lang.org/book/ch08-02-strings.html#bytes-and-scalar-values-and-grapheme-clusters-oh-my
$str = "नमस्ते";
// Alternatively:
//$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
?>