基于PHP中的unicode字符范围将字符串拆分为数组

时间:2016-12-09 22:04:55

标签: php arrays regex unicode split

对于模棱两可的主题感到抱歉,我正在寻找的是一个带有西里尔字符的字符串,可能会像

«Добрый день!» - сказал он, потянувшись…

进入类似

的数组
[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 个答案:

答案 0 :(得分:2)

使用以下正则表达式解决方案:

$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 demo

<强>详情:

  • \b(\p{Cyrillic}+\W*) - 匹配并捕获一个完整的西里尔字,后面有0个非字字符
  • 模式用捕获括号包裹,PREG_SPLIT_DELIM_CAPTURE将捕获的值推送到结果数组中
  • PREG_SPLIT_NO_EMPTY将丢弃数组中的空值
  • /u修饰符将使\b(字边界)和\W识别Unicode,并允许使用正则表达式处理Unicode字符串。

答案 1 :(得分:2)

如何使用\b word boundary分割初始u modifier

$res = preg_split('/\b(?=\w)(?!^)/u', $str);

lookahead确保\b后跟word character(?!^)会阻止空匹配if start

See this demo at eval.in

答案 2 :(得分:1)

如果下一个字符是cyrrilic字符,你还要检查一下。这段代码将完成这项工作:

$t = preg_split ('/(?<=[^а-я])(?=[а-я]+)/ius', $text, NULL, PREG_SPLIT_NO_EMPTY);

它给出了这个输出:

Array
(
    [0] => «
    [1] => Добрый 
    [2] => день!» - 
    [3] => сказал 
    [4] => он, 
    [5] => потянувшись…
)

Here you can try it.

答案 3 :(得分:0)

试试这个正则表达式:[\x{0400}-\x{04FF}]*[^\x{0400}-\x{04FF}]*。从0400到04FF的所有unicode字符都被视为西里尔字母。它应该完全匹配你想要的。您也可以按照另一个答案中的建议将\x{0400}-\x{04FF}替换为\p{Cyrillic}

这是该范围内的所有字符:
ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ0АБВГДЕЖЗИЙКЛМНОП0РСТУФХЦЧШЩЪЫЬЭЮЯ0абвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџ0460ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿ04C0ӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏ04D0ӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯ04F0ӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿ