如何分割英文字母,数字和汉字?

时间:2015-07-04 22:42:21

标签: php regex string explode

为了更好地说明这个问题,我将列出几个输入以及所需的输出:

  • 输入1:本中文5142
  • OUTPUT 1:数组('This','中文','5142')

  • 输入2:本中文,5142

  • OUTPUT 2:数组('This','中文','5142')

基本上,输入字符串可以有空格,英文字母,数字和汉字的顺序是未知的,可以多次出现。

我找到了一个可以在没有中文字符的情况下完成工作的人(参考:Splitting string containing letters and numbers):

$array = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $str);

我可以粗略地理解上面的正则表达式:

  1. (,??s +) - 用空格分隔
  2. (?&lt; = [a-z])(?= \ d) - 如果一个数字在一个字母后面,则拆分它们
  3. (?&lt; = \ d)(?= [a-z]) - 如果一个字母在一个数字后面,则将它们分开
  4. 所以我天真地想这样:我需要做三件事:

    1. 如果一个数字正好在一个字母或中文字符之后,将它们分开
    2. 如果一封信正好在一个数字或中文字符之后,将它们分开
    3. 如果一个汉字正好在一个字母或数字之后,将它们分开
    4. 为了达到1,我的想法是这样的:

      (?<=[a-z\x4E00-\x9FA5])(?=\d)
      

      其中\ x4E00- \ x9FA5是匹配中文字符。但这不起作用!

1 个答案:

答案 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字符串读取。