note 55708 deleted from function.substr by nlopess
| From: | nlopess@php.net | Date: | Thu, 11 Aug 2005 11:43:06 +0000 |
| Subject: | note 55708 deleted from function.substr by nlopess | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-93429@lists.php.net to get a copy of this message | ||
Note Submitter: webmaster at phptree dot com
Reason: useless
----
substr is not safe to multibyte characters.
perhaps,you can do like this:
<?php
/**
* string mysubstr(string $string,int $start[,int $length])
* @param string $string input mutibyte string
* @param int $start start offset
* @param int $length the length you want to get
*/
function mysubstr($string,$start,$length='')
{
$tmpstr = '';
$str = '';
if($start<0)$start+=strlen($string);
if($length<0)
{
$offset = strlen($string)+$length;
}
else
{
$offset = min(strlen($string),$start+$length);
}
for($i=0;$i<$offset;$i++){
if (ord($string{$i})>127){
if($i<$start)
{
$i++;
continue;
}
$tmpstr = $string{$i}.$string{++$i};//it is much faster than substr($string,$i,2);
}else{
if($i<$start)continue;
$tmpstr = $string{$i};
}
$str .= $tmpstr;
}
return $str;
}
$string ="¶à×Ö½Ú×Ö·û´®multibyte string¶à×Ö½Ú×Ö·û´®multibyte
string";//string that contains GB2312 characters
echo mysubstr($string,0,18);
echo "<br>\r\n";
echo mysubstr($string,18,18);
echo "<br>\r\n";
echo mysubstr($string,36,18);
echo "<br>\r\n";
echo mysubstr($string,54,18);
echo "<br>\r\n";
echo mysubstr($string,-36,-5);
echo "<br>\r\n";
?>