2017-03-04 121 views
1

我正在做一些类来处理来自php的僧伽罗Unicode,我想分开混合字符串Unicode和ascii字符作为单独的单词与空格。 例如:从PHP空白区分Unicode和Ascii字符集


$inputstr = "ලංකාABCDE TEST1දිස්ත්‍රික් වාණිජ්‍යTEMP මණ්ඩලය @ MNOPQ"; 

function separatestring($inputstr) 
{ 
//do some code 
return $inputstr; 
} 


echo separatestring($inputstr); 

//OUTPUT String = ලංකා ABCDE TEST1 දිස්ත්‍රික් වාණිජ්‍ය TEMP මණ්ඩලය @ MNOPQ 

我有与正则表达式几个循环方法的preg_replace和尝试,但任何方法都没有成功。请帮助我。谢谢大家!

+0

如果您已尝试,请向我们显示代码。我们可以从那里开始提供帮助。 –

回答

0

这个工作对我来说:

$inputstr = "ලංකාABCDE TEST1දිස්ත්‍රික් වාණිජ්‍යTEMP මණ්ඩලය @ MNOPQ"; 

function separatestring($inputstr) 
{ 
    $re = '#\s+|(?<=[^\x20-\x7f])(?=[\x20-\x7f])' 
      . '|(?<=[\x20-\x7f])(?=[^\x20-\x7f])#'; 
    $array = preg_split($re, $inputstr); 
    return array_filter($array); 
} 


echo implode(" ", separatestring($inputstr)); 
//OUTPUT String = ලංකා ABCDE TEST1 දිස්ත්‍රික් වාණිජ්‍ය TEMP මණ්ඩලය @ MNOPQ 

一个分裂的正则表达式意味着:

  • # - 启动正则表达式(分隔符字符),
  • \s+ - 分裂的一个或多个空白字符(以空格作为分隔符),
  • | - 或
  • (?<=[^\x20-\x7f])(?=[\x20-\x7f]) - 分裂非ASCII和ASCII字符(不计算它们作为隔板)之间的边界,
  • | - 或,
  • (?<=[\x20-\x7f])(?=[^\x20-\x7f]) - 上ASCII和非ASCII字符之间的边界(分裂不计算他们作为分隔符),
  • # - 结束正则表达式(分隔符)。

不幸的是,我的正则表达式不是太优雅,所以有时会返回空字符串(因为空白字符也是ASCII字符)。我已经通过array_filter来解决这个问题,但可能会有更优雅的解决方案。我写过separatestring,它以数组的形式返回。如果您想要一个字符串,请用以下方式替换return声明:

return implode(" ", array_filter($array)); 
+0

感谢Dzmitry您的代码工作完美,节省了大量时间......同时感谢您的好解释。 –

+0

谢谢,我很高兴听到它!如果您通过点击下面的复选标记来接受答案,这将对我有所帮助。 –