Разбиение строки на массив на основе диапазона символов 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);


Почти работает, но он также разбивается на обычные символы, такие как пробелы и знаки препинания, и это не то, что я хочу. Очевидно, что-то не так с моим регулярным выражением. Как я должен изменить это, чтобы получить результат, как в примере выше?

819   4  

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] => потянувшись…
//)

Смотрите демонстрацию PHP

Подробности :

  • \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 следуетсловесный символ . (?!^) предотвращает пустой матч , если начать .

Смотрите эту демонстрацию на eval.in

Попробуйте это регулярное выражение: [\x{0400}-\x{04FF}]*[^\x{0400}-\x{04FF}]*. Все символы юникода от 0400 до 04FF считаются кириллическими. Он должен точно соответствовать тому, что вы хотите. Вы также можете заменить \x{0400}-\x{04FF} на \p{Cyrillic}, как предложено в другом ответе.

Это все персонажи в том, что диапазон:
ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ0АБВГДЕЖЗИЙКЛМНОп0рстуфхцчшщъыьэюя0абвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџ0460ѡѡѣѣѥѥѧѧѩѩѫѫѭѭѯѯѱѱѳѳѵѵѷѷѹѹѻѻѽѽѿѿҁҁ҂҃҄҅҆҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҫҫҭҭүүұұҳҳҵҵҷҷҹҹһһҽҽҿҿ04c0ӏӂӂӄӄӆӆӈӈӊӊӌӌӎӎ04d0ӑӑӓӓӕӕӗӗәәӛӛӝӝӟӟӡӡӣӣӥӥӧӧөөӫӫӭӭӯӯ04f0ӱӱӳӳӵӵӷӷӹӹ

Comments

    Ничего не найдено.