function gb_substr($str,$start,$length)
{
if(($start+1) >= strlen($str))
{
$start = 0;
}
$thestart = 0;
$result = "";
for($i= 0; $i < $start; $i++)
{
if(ord(substr($str,$thestart,1)) > 0xa0)
{
$thestart += 2;
}
else
{
$thestart += 1;
}
}
$length= $thestart + $length;
if($length > strlen($str))
{
$length = strlen($str);
}
for($i = $thestart; $i < $length; $i++)
{
if(ord(substr($str,$i,1)) > 0xa0)
{
$result .= substr($str,$i,2);
$i++;
$length++;
}
else
{
$result .= substr($str,$i,1);
}
}
return $result;
}
echo gb_substr("<b>M<b>a</b>rry你好</b>",0,5);
/*
许多的时候,我们可以通过此函数,在页面中调出标题指定的字符来显示新闻内容,但是如果想要调出的标题为:"<b>M<b>a</b>rry你好</b>"我只想显示5个字符,即显示"Marray",但是如何识别<b>,和</b不算在截取的范围之内呢?上面这个函数应当如何扩展一下啊?
*/

解决方案 »

  1.   

    先把 HTML tags trip掉.
    再取...
      

  2.   

    楼上的朋友,[img=http://profile.csdn.net/mrshelly/picture/2.jpg][/img]
    你说的我也想到了,但是如果把html tags去掉的话,那么显示出来的标题文字不就没有效果了吗?也就是说如果原来是红色的字体,去掉之后不就不是红色了吗?
      

  3.   

    楼上的朋友, 
    你说的我也想到了,但是如果把html tags去掉的话,那么显示出来的标题文字不就没有效果了吗?也就是说如果原来是红色的字体,去掉之后不就不是红色了吗
      

  4.   

    顺便问一下,csdn上规定是一天回复一个贴子10分,还是一天回复10个贴子也10分
      

  5.   

    这样写$s = "p<b>M<b>a</b>rry你好</b>www";echo untag_substr($s, 2, 5);function untag_substr($str, $stast, $length) {
      $ar = preg_split("/(<\/?[a-z].*?>)/is", $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
      $n = $stast;
      $m = 0;
      foreach($ar as $k=>$v) {
        if($v[0] == '<') continue;
        if($m > $length) {
           $ar[$k] = '';
           continue;
        }
        for($i=0; $i<strlen($v); $i++) {
          if(ord($v[$i]) > 0xa0) $i++;
          if($n > 0) {
            $n --;
            $ar[$k] = '';
          }else $m ++;
          if($m == $length) {
            $ar[$k] = substr($v, 0, $i+1);
            $m++;
          }
        }
       }
      return join('', $ar);
    }代码有点粗糙,你自己改改吧