Разбиение строки на массив на основе диапазона символов unicode в PHP
Извините за неоднозначную тему, но я ищу строку с кириллическими символами, которая может выглядеть как
«Добрый день!» - сказал он, потянувшись…
В массив, который выглядит как
[0] => «
[1] => Добрый␠
[2] => день!»␠-␠
[3] => сказал␠
[4] => он,␠
[5] => потянувшись…
Таким образом, по существу, я ищу разрыв, который произойдет на границе между любым символом и кириллическим символом (диапазон [а-я]), хотя это должно быть верно только тогда, когда мы переходим от любого символа к кириллическому символу, а не наоборот. Я видел примеры, которые успешно решают эту проблему с помощью знаков препинания и латинский алфавит с
preg_split('/([^.:!?]+[.:!?]+)/', 'hello:there.everyone!so.how?are:you', NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );
Но мои попытки перепрофилировать его во что-то другое до сих пор не увенчались успехом:
preg_split ('/(?<=[^а-я])/ius', $text, NULL, PREG_SPLIT_NO_EMPTY);
Почти работает, но он также разбивается на обычные символы, такие как пробелы и знаки препинания, и это не то, что я хочу. Очевидно, что-то не так с моим регулярным выражением. Как я должен изменить это, чтобы получить результат, как в примере выше?
4 ответов:
Вы также должны проверить, глядя вперед, является ли следующий символ кириллическим. Этот код сделает свою работу:
$t = preg_split ('/(?<=[^а-я])(?=[а-я]+)/ius', $text, NULL, PREG_SPLIT_NO_EMPTY);Это дает такой результат:
Array ( [0] => « [1] => Добрый [2] => день!» - [3] => сказал [4] => он, [5] => потянувшись… )
Используйте следующее решение регулярных выражений:
$s = "«Добрый день!» - сказал он, потянувшись…"; $res = preg_split('/\b(\p{Cyrillic}+\W*)/u', $s, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); print_r($res); // Array( // [0] => « // [1] => Добрый // [2] => день!» - // [3] => сказал // [4] => он, // [5] => потянувшись… //)Подробности :
\b(\p{Cyrillic}+\W*)- сопоставляет и захватывает целое кириллическое слово с 0 + не-словными символами после него- шаблон завернут в захватывающие скобки и
PREG_SPLIT_DELIM_CAPTUREпоместит захваченные значения в результирующий массивPREG_SPLIT_NO_EMPTYотбрасывает пустые значения в массиве- Модификатор
/uсделает\b(граница слова) и\WЮникод понятными, и позволит обрабатывать строки Unicode с регулярным выражением.
Как насчет расщепления на начальном этапе
\bграница слова сuмодификатор .$res = preg_split('/\b(?=\w)(?!^)/u', $str);Lookahead гарантирует, что за
\bследуетсловесный символ .(?!^)предотвращает пустой матч , если начать .
Попробуйте это регулярное выражение:
[\x{0400}-\x{04FF}]*[^\x{0400}-\x{04FF}]*. Все символы юникода от 0400 до 04FF считаются кириллическими. Он должен точно соответствовать тому, что вы хотите. Вы также можете заменить\x{0400}-\x{04FF}на\p{Cyrillic}, как предложено в другом ответе.Это все персонажи в том, что диапазон:
ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ0АБВГДЕЖЗИЙКЛМНОп0рстуфхцчшщъыьэюя0абвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџ0460ѡѡѣѣѥѥѧѧѩѩѫѫѭѭѯѯѱѱѳѳѵѵѷѷѹѹѻѻѽѽѿѿҁҁ҂҃҄҅҆҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҫҫҭҭүүұұҳҳҵҵҷҷҹҹһһҽҽҿҿ04c0ӏӂӂӄӄӆӆӈӈӊӊӌӌӎӎ04d0ӑӑӓӓӕӕӗӗәәӛӛӝӝӟӟӡӡӣӣӥӥӧӧөөӫӫӭӭӯӯ04f0ӱӱӳӳӵӵӷӷӹӹ
Comments