为了更好地说明这个问题,我将列出几个输入以及所需的输出:
OUTPUT 1:数组('This','中文','5142')
输入2:本中文,5142
基本上,输入字符串可以有空格,英文字母,数字和汉字的顺序是未知的,可以多次出现。
我找到了一个可以在没有中文字符的情况下完成工作的人(参考:Splitting string containing letters and numbers):
$array = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $str);
我可以粗略地理解上面的正则表达式:
所以我天真地想这样:我需要做三件事:
为了达到1,我的想法是这样的:
(?<=[a-z\x4E00-\x9FA5])(?=\d)
其中\ x4E00- \ x9FA5是匹配中文字符。但这不起作用!
答案 0 :(得分:4)
要以明确的方式执行此操作,您可以使用:
$result = preg_split('~(?<!\p{Latin})(?=\p{Latin})|(?<!\p{Han})(?=\p{Han})|(?<![0-9])(?=[0-9])~u', $str, -1, PREG_SPLIT_NO_EMPTY);
(在每个边界上拆分字符串)。请注意,如果您只有三种字符,则可以删除其中一个边界(您想要的边界)。
如果要从结果中删除空格,可以将所有空格放在非捕获组中,并在模式的开头添加\s*
。
然而,使用preg_match_all
可以用更少的努力得到相同的结果:
if (preg_match_all('~\p{Latin}+|\p{Han}+|[0-9]+~u', $str, $matches))
$result = $matches[0];
u修饰符强制正则表达式引擎将字符串作为UTF8字符串读取。