php 截取字符串函数(中文字符串)

php 截取字符串函数(中文字符串) 这是一款php 截取字符串函数哦,这是一款支持中文字符串哦,它可以截取html与中西文,等混合的内容,并且把html标签不算在字符截取之内,如果html标签没有闭合,程序将自动过滤多余的标签。

方法一:

  1. function mysubstr( $str, $length ){
  2. $tagcnt = 0;
  3. $charcnt = 0;
  4. $tag = '';
  5. $maxlen = strlen( $str );
  6. $resultstr = '';
  7. $tagstack = array();
  8. for( $i = 0; $i < $length; $i++ ){
  9. if( $str[$i] == '<' ){
  10. $resultstr .= $str[$i];
  11. for( $j=$i; $str[$j]!='>'; $j++,$length++ ){
  12. $tag .= $str[$j];
  13. }
  14. $tagcnt++;
  15. $length++;
  16. $tag .= '>';
  17. //如果是开始标记,则入栈,如果是与之相对应的结束标记则出栈
  18. if( preg_match('/<([^/]+)?>/i', $tag, $r) ){
  19. echo '入栈:',htmlspecialchars($r[1]),'<br />';
  20. array_push($tagstack, $r[1]);
  21. }
  22. elseif( preg_match( '/'.$tagstack[count($tagstack)-1].'/', $tag ) ){
  23. echo '出栈:',htmlspecialchars($tagstack[count($tagstack)-1]),'<br />';
  24. array_pop( $tagstack );
  25. }
  26. $tag = '';
  27. continue;
  28. }
  29. $charcnt++;
  30. $resultstr .= $str[$i];
  31. }
  32. echo '<hr size=1>最后结果为:';
  33. //栈是空的直接返回
  34. if(emptyempty($tagstack)){
  35. return $resultstr;
  36. }
  37. //否则去掉没有结束标记的开始标记
  38. else{
  39. while(!emptyempty($tagstack)){
  40. $tag = array_pop($tagstack);
  41. $index = strrpos($resultstr, $tag);
  42. for($i = $index-1; $resultstr[$i] != '>'; $i++ ){
  43. $resultstr[$i] = '';
  44. }
  45. $resultstr[$i++] = '';
  46. }
  47. return $resultstr;
  48. }
  49. }
  50. $sttime = microtime(true);
  51. $stmem = memory_get_usage();
  52. $str = "a1<body>b2<p>c3<em>d4</em>e5</p>f6</body>g7h8";
  53. echo '处理结果为:<br/><hr size=1>',htmlspecialchars( mysubstr( $str, 18 ) ),'<br />';
  54. echo "内存使用情况:",(memory_get_usage()-$stmem),'<br />';
  55. echo "算法运行时间(microtime):",(microtime(true)-$sttime),'<br/>';

方法二:

  1. **
  2. * 函数名 html_substr
  3. * 功能 从html串中截取指定长度的字串,html标记不计算在内
  4. * 参数
  5. * $str 要截取的串
  6. * $len 要截取的长度
  7. * $mode 不匹配的标记的处理方式 0 删去(默认),1 补齐
  8. * 返回 截取到的串
  9. * 说明
  10. * 未考虑多字节字符,仅已字节做计数单位
  11. * 未考虑可单独存在的标记
  12. **/
  13. function html_substr($str, $len, $mode=0) {
  14. $ar= preg_split('/(<!--.*-->|<[^>]*>)/s', $str, -1, preg_split_delim_capture);
  15. foreach($ar as $k => $v) {
  16. if($v{0} != '<') {
  17. $len = $len - strlen($v);
  18. if($len < 0) $ar[$k] = substr($v, 0, $len);
  19. }else $ar[$k] = strtolower($v);
  20. if($len <= 0) break;
  21. }
  22. $ar = array_slice($ar, 0, $k+1);
  23. $len = count($ar);
  24. foreach($ar as $k=>$v) {
  25. if($v{0} == '<' && $v[1] != '/') {
  26. $ch = str_replace('<', '</', $v);
  27. for($i=$k+1; $i<$len && $ar[$i]!=$ch; $i++);
  28. if($i == $len)
  29. if($mode)
  30. $ar[$len] = $ch . $ar[$len];
  31. else
  32. $ar[$k] = '';
  33. }
  34. }
  35. return join('', $ar);
  36. }
  37. $str = "123<em>abc</em>456<em>def</em>789";
  38. echo '<xmp>';
  39. echo html_substr($str, 5) . php_eol;
  40. echo html_substr($str, 5, 1);

方法三:

  1. $str = "a1<body>b2c3<p><em>d4</em>e</p>5f6</body>g7h8";
  2. $gn = 7;
  3. $i = $j = $k = 0;
  4. while( ($c = $str[$i++]) && $j < $gn )
  5. {
  6. if( $c == '<')
  7. {
  8. $tag = 1;
  9. }
  10. elseif($c == '>')
  11. {
  12. if(trim($tg,'/') == 'em')
  13. {
  14. $tgs[$j-1] = '<'.$tg.'>';
  15. }
  16. else
  17. {
  18. if($tgs[$j-1]) $ogs[$j-1] = '1|'.'<'.$tg.'>';
  19. else $ogs[$j-1] = '0|'.'<'.$tg.'>';
  20. }
  21. $tag = 0;
  22. $tg = '';
  23. }
  24. elseif($tag == 1)
  25. {
  26. $tg .= $c;
  27. }
  28. else
  29. {
  30. $tmp[] = $c;
  31. $j++;
  32. }
  33. }
  34. $ts = count($tgs);
  35. if($ts % 2) array_pop($tgs);
  36. foreach($tmp as $k=>$v)
  37. {
  38. $ba = explode('|',$ogs[$k],2);
  39. if( $tgs[$k] && $ogs[$k])
  40. {
  41. if($ba[0])
  42. {
  43. $s .= $v.$tgs[$k].$ba[1];
  44. }
  45. else $s .= $v.$ba[1].$tgs[$k];
  46. }
  47. else $s .= $v.$tgs[$k].$ba[1];
  48. }
  49. echo htmlspecialchars($s);