Как разбить китайские иероглифы в PHP?

Мне нужна помощь в том, как разделить китайские символы, смешанные с английскими словами и цифрами в PHP.

Например, если я прочитаю

FrontPage 2000中文版應用大全

я надеюсь получить

FrontPage, 2000, 中,文,版,應,用,大,全

or

FrontPage, 2,0,0,0, 中,文,版,應,用,大,全

Как я могу этого добиться?

Заранее спасибо :)


person Some Noob Student    schedule 06.11.2010    source источник
comment
Этот ответ делает то же, что и первый фрагмент принятого ответа: stackoverflow.com/a/55783469/2943403   -  person mickmackusa    schedule 27.07.2020


Ответы (3)


Предполагая, что вы используете UTF-8 (или вы можете преобразовать его в UTF-8 с помощью Iconv или некоторых других инструментов), затем используйте модификатор u (doc: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php )

<?
    $s = "FrontPage 2000中文版應用大全";
    print_r(preg_match_all('/./u', $s, $matches));
    echo "\n";
    print_r($matches);
?>

дам

21
Array
(
    [0] => Array
        (
            [0] => F
            [1] => r
            [2] => o
            [3] => n
            [4] => t
            [5] => P
            [6] => a
            [7] => g
            [8] => e
            [9] =>  
            [10] => 2
            [11] => 0
            [12] => 0
            [13] => 0
            [14] => 中
            [15] => 文
            [16] => 版
            [17] => 應
            [18] => 用
            [19] => 大
            [20] => 全
        )

)

Обратите внимание, что мой исходный код также хранится в файле, закодированном в UTF-8, чтобы $s содержал эти символы.

Следующее будет соответствовать буквенно-цифровому как группа:

<?
$s = "FrontPage 2000中文版應用大全";
print_r(preg_match_all('/(\w+)|(.)/u', $s, $matches));
echo "\n";
print_r($matches[0]);
?>

результат:

10
Array
(
    [0] => FrontPage
    [1] =>  
    [2] => 2000
    [3] => 中
    [4] => 文
    [5] => 版
    [6] => 應
    [7] => 用
    [8] => 大
    [9] => 全
)
person nonopolarity    schedule 06.11.2010
comment
Большое спасибо за ваше понимание! - person Some Noob Student; 06.11.2010
comment
Обратите внимание, что использование только . не соответствует таким композициям символов, как (композиция U+0061 и U+0308). - person Gumbo; 06.11.2010
comment
@動靜能量Извините, я не могу голосовать, недостаточно репутации; честно говоря, я бы, если бы мог. - person Some Noob Student; 07.11.2010

    /**
     * Reference: http://www.regular-expressions.info/unicode.html
     * Korean: Hangul
     * CJK: Han
     * Japanese: Hiragana, Katakana
     * Flag u required
     */

    preg_match_all(
        '/\p{Hangul}|\p{Hiragana}|\p{Han}|\p{Katakana}|(\p{Latin}+)|(\p{Cyrillic}+)/u',
        $str,
        $result
    );

Этот тоже работает, если вы используете PHP 7.0.

Этот просто не работает. Я сожалею, что проголосовал за нерабочее решение....

<?
    $s = "FrontPage 2000中文版應用大全";
    print_r(preg_match_all('/(\w+)|(.)/u', $s, $matches));
    echo "\n";
    print_r($matches[0]);
?>
person tom10271    schedule 10.05.2017
comment
но ваше решение не включает знаки препинания. Знаки препинания в китайском языке имеют значение! - person fmchan; 20.10.2020
comment
@fmchan Вы можете найти соответствующий Unicode и использовать диапазон Unicode в RegEx. stackoverflow .com/questions/26458654/ compart.com/en/unicode/U +3002 - person tom10271; 20.10.2020

С помощью этого кода вы можете сделать так, чтобы китайский текст (utf8) переносился в конец строки, чтобы его можно было прочитать.

print_r(preg_match_all('/([\w]+)|(.)/u', $str, $matches));
$arr_result = array();

foreach ($matches[0] as $key => $val) {
    $arr_result[]=$val;
    $arr_result[]="&#8203;"; //add Zero-Width Space
} 
foreach ($arr_result as $key => $val) {
    $out .= $val;
} 
return $out;
person user 1007017    schedule 28.02.2012