« 惊蛰看傻儿司令记的两句 »

php汉字的截取完美解决方案

此函数巧妙地运用了正则表达式, 用起来很方便, 就像 substr 的用法一样, 可以正向截取也可反相截取, 值得学习!

PHP代码如下:

<?php
function c_substr($string, $from, $length = null){
    preg_match_all('/[x80-xff]?./', $string, $match);
    if(is_null($length)){
  $result = implode('', array_slice($match[0], $from));
    }else{
  $result = implode('', array_slice($match[0], $from, $length));
    }
    return $result;
}
$str = "zhon华人min共和guo";
$from = 3;
$length = 7;
echo(c_substr($str, $from, $length));
// 输出: n华人min共
//还有utf-8的
/*
Regarding windix's function to handle UTF-8 strings:
one can use the "u" modifier on the regular expression so that the pattern string is treated as UTF-8
(available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32).
This way the function works for other encodings too (like Greek for example).
The modified function would read like this:
*/
function utf8_substr($str,$start) {
$null = "";
   preg_match_all("/./u", $str, $ar);
   if(func_num_args() >= 3) {
 $end = func_get_arg(2);
 return join($null, array_slice($ar[0],$start,$end));
   } else {
 return join($null, array_slice($ar[0],$start));
   }
}
?>

之二:

<?php
/*	http://www.dngz.net/blog/	*/
function get_substr($string,$start='0',$length='')
{
$start = (int)$start;
$length = (int)$length;
$i = 0;
if(!$string)
{
  return;
}
if($start>=0)
{
  while($i<$start)
  {
   if(ord($string[$i])>127)
   {
    $i = $i+2;
   }
   else
   {
    $i++;
   }
  }
  $start = $i;
  if($length=='')
  {
   return substr($string,$start);
  }
  elseif($length>0)
  {
   $end = $start+$length;
   while($i<$end)
   {
    if(ord($string[$i])>127)
    {
     $i = $i+2;
    }
    else
    {
     $i++;
    }
   }
   if($end != $i-1)
   {
    $end = $i;
   }
   else
   {
    $end--;
   }
   $length = $end-$start;
   return substr($string,$start,$length);
  }
  elseif($length==0)
  {
   return;
  }
  else
  {
   $length = strlen($string)-abs($length)-$start;
   return get_substr($string,$start,$length);
  }
}
else
{
  $start = strlen($string)-abs($start);
  return get_substr($string,$start,$length);
}
}
?>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

一些什么

网友评论

最近日志

心灵博客 © xylx 2009