使用PHP中的空格分隔Unicode和Ascii Charactors

时间:2017-03-04 18:26:23

标签: php

我正在做一些从php处理Sinhala Unicode的类,我想将混合字符串Unicode和ascii char分隔为带有空格的单独单词。 例如:

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

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


echo separatestring($inputstr);

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

我尝试使用带有Regex的preg_replace和几种循环方法,但任何方法都没有成功。请帮帮我。谢谢大家!

1 个答案:

答案 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

分割的正则表达式意味着以下内容:

  • # - 启动regexp(deimeter character),
  • \s+ - 拆分一个或多个空格字符(将空格作为分隔符计算),
  • | - 或,
  • (?<=[^\x20-\x7f])(?=[\x20-\x7f]) - 在非ASCII和ASCII字符之间的边界上拆分(不将它们视为分隔符),
  • | - 或,
  • (?<=[\x20-\x7f])(?=[^\x20-\x7f]) - 拆分ASCII和非ASCII字符之间的边界(不将它们视为分隔符),
  • # - 结束regexp(分隔符)。

不幸的是,我的正则表达式并不太优雅,因此有时返回空字符串(因为空格也是ASCII字符)。我已经array_filter来解决这个问题,但可能存在更优雅的解决方案。

我以这样的方式编写separatestring,以便在数组中返回。如果需要字符串,请以这种方式替换return语句:

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