对于模棱两可的主题感到抱歉,我正在寻找的是一个带有西里尔字符的字符串,可能会像
«Добрый день!» - сказал он, потянувшись…
进入类似
的数组[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);
几乎可以工作,但它也会被常规字符(例如空格和标点符号)拆分,这不是我想要的。显然我的正则表达式有问题。我应该如何修改它以获得上面示例中的结果?
答案 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。
答案 2 :(得分:1)
如果下一个字符是cyrrilic字符,你还要检查一下。这段代码将完成这项工作:
$t = preg_split ('/(?<=[^а-я])(?=[а-я]+)/ius', $text, NULL, PREG_SPLIT_NO_EMPTY);
它给出了这个输出:
Array
(
[0] => «
[1] => Добрый
[2] => день!» -
[3] => сказал
[4] => он,
[5] => потянувшись…
)
答案 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ӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿ