本帖最后由 luyinhu 于 2009-09-03 22:45:16 编辑

解决方案 »

  1.   

    1方法:$str='外星人入侵';
    //echo mb_strlen($str);
    $len=strlen($str);
    for($i=0;$i<$len;$i++){
    if(ord(substr($str,$i,1))>0xa0){
    //echo substr($str,$i,2)."&nbsp;";//单个组合
    if($len-$i=='2'){
    exit;
    }else{
    echo substr($str,$i,4)."&nbsp;";//双双组合
    }
    $i++;
    }else{
    echo substr($str,$i,1)."<br>";
    }
    }
    2.
    $str='微笑Pasta';
    $lenstrlen($str);
    for($j;$j<$len;$j++){
    if(ord(substr($str,$j,1))>0xa0){
    //echo substr($str,$j,2)."&nbsp;";//单字组合
    if($j<'2'){
                  echo substr($str,$j,4)."&nbsp;";//双字组合
    }else{
    echo substr($str,$j,0);
    }
    $j++;
    }else{
    echo substr($str,$j,1);
    }
    }
    3,4的解法类推!
      

  2.   

    2.方法有点小错误.$lenstrlen($str);
    =>$len=strlen($str);
      

  3.   

    全部通用:
    <pre>
    <?php
    function q($v)
    {
    $arr1_all = array();$arr2_all = array();
    foreach (explode(' ',trim(preg_replace("/\w+/",' $0 ',$v))) as $a){
    $arr2 = array();
    if (preg_match("/^\d+$/",$a)) {
    $arr1 = str_split($a,1);
    if ($a<1000){
    $len = count($arr1);
    for ($i=0;$i<$len;$i++){
    if ($i!=0) $arr2[] = $arr1[$i-1].$arr1[$i];
    }
    }
    } elseif (preg_match("/\w+/",$a)){
    $arr1 = array($a);
    } else {
    $arr1 = str_split($a,3);
    $len = count($arr1);
    for ($i=0;$i<$len;$i++){
    if ($i!=0) $arr2[] = $arr1[$i-1].$arr1[$i];
    }
    }
    $arr1_all = array_merge($arr1_all,$arr1);
    $arr2_all = array_merge($arr2_all,$arr2);
    }
    $arr = array_merge($arr1_all,$arr2_all);
    return $arr;
    }
    print_r(q('外星人入侵 微笑Pasta康熙来了090901绝代商娇17'));
    print_r(q('外星人入侵'));
    print_r(q('微笑Pasta'));
    print_r(q('康熙来了090901'));
    print_r(q('绝代商娇17'));
    /* utf-8 */
    ?>
    </pre>
      

  4.   

    谢谢jnkc,测试成功.我对正则不懂,能帮忙解答正则的意思吗?
      

  5.   

    preg_replace("/\w+/",' $0 ',$v)
    \w 匹配字母或数字
    + 匹配1次或多次
    $0 匹配得到的结果
    这个是为了把中文和其它以空格分隔开preg_match("/^\d+$/",$a)
    ^ 字符串的开始位置
    \d 数字
    $ 字符串结束位置
    就是检验是否全数字,其实也相当于is_numeric()str_split($a,3)
    3是因为utf-8下中文占3字节
    就是纯中文字符串按单个中文字分割为数组其它相关的查一下语法手册吧