Выражение PHP Regex с участием японского языка

Моя цель - отфильтровать документ Microsoft Word (.docx), захватив все японские кандзи и кана. Текущий код, с которым я работаю, следующий:

preg_match_all('~[\x{4e00}-\x{9faf}]([\x{3040}-\x{309f}]) \= ([a-z]) \=+~u', $data, $matches);

Согласно некоторым исследованиям, я обнаружил следующие значения Unicode в японском тексте: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml

Пример данных, с которыми я работаю, выглядит так:

時 (と き) = токи = время; час; повод; момент を = wo = частица, обозначающая прямой объект предложения (時 = время) 超 え て (こ え て) = koete = крест

Моя конечная цель - иметь возможность запускать preg_match_all для получения данных по аналогичному шаблону, который выглядит как «超 え て (こ え て) = koete». Информация перед (и информация внутри () и латинизация после между = =

Результатом, который я ищу, будет возвращенный массив, который выглядит так:

array(
    0 => array('時', 'とき', 'toki'),
    1 => array('超えて', 'こえて', 'koete')
);

Первый результат в каждом массиве включает в себя как «Кандзи, хирагана и, возможно, катакана», тогда как второй результат - только хирагана, а третий результат - только обычные буквенные символы. Я не слишком хорош с регулярным выражением и добавляю Unicode Japaense, и я невежественен, любая помощь будет очень признательна! Спасибо!


person Bryse Meijer    schedule 26.04.2011    source источник


Ответы (1)


Вы можете использовать специальные заполнители регулярных выражений Unicode вместо числовых диапазонов, если вы используете модификатор /u:

preg_match_all('/
    ([\p{Han}\p{Katakana}\p{Hiragana}]+)    # Kanji
    (?: [(]                                 # optional part: paren (
    ([\p{Hiragana}]+)                       # Hiragana
    [)] )?                                  # closing paren )
    \s*=\s*                                 # spaces and =
    ([\w\s;=]+)                             # English letters
    /ux',
    $source,  $matches, PREG_SET_ORDER
);
print_r($matches);

Я заметил, что хирагана в скобках не обязательна, поэтому я сделал ваше регулярное выражение немного более сложным с помощью (?: ... )?, который опционально опускает эту часть.

Обратите внимание, что порядок результатов немного отличается, потому что preg_match_all обычно сохраняет полную строку соответствия в индексе [0]:

[0] => Array
    (
        [0] => 時(とき) = toki = time; hour; occasion; moment
        [1] => 時
        [2] => とき
        [3] => toki = time; hour; occasion; moment
    )
person mario    schedule 26.04.2011