찾다
php教程PHP源码html串中截取指定长度的字串,html标记不计算在内

跳至 [1] [2] [3] [4] [5] [全屏预览]
/**
 * 函数名 html_substr
 * 功能 从html串中截取指定长度的字串,html标记不计算在内
 * 参数
 *  $str 要截取的串
 *  $len 要截取的长度
 *  $mode 不匹配的标记的处理方式 0 删去(默认),1 补齐
 * 返回 截取到的串
 * 说明
 *  未考虑多字节字符,仅已字节做计数单位
 *  未考虑可单独存在的标记
 **/
function html_substr($str, $len, $mode=0) {
  $ar= preg_split('/(<\!--.*-->|<[^>]*>)/s', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
  foreach($ar AS $k => $v) {
    if($v{0} != '<') {
      $len = $len - strlen($v);
      if($len < 0) $ar[$k] = substr($v, 0, $len);
    }else $ar[$k] = strtolower($v);
    if($len <= 0) break;
  }
  $ar = array_slice($ar, 0, $k+1);
  $len = count($ar);
  foreach($ar as $k=>$v) {
    if($v{0} == '<' && $v[1] != '/') {
      $ch = str_replace('<', '</', $v);
      for($i=$k+1; $i<$len && $ar[$i]!=$ch; $i++);
      if($i == $len)
        if($mode)
          $ar[$len] = $ch . $ar[$len];
        else
          $ar[$k] = '';
    }
  }
  return join('', $ar);
}
$str = "123<em>abc</em>456<em>def</em>789";
 
echo '<xmp>';
echo html_substr($str, 5) . PHP_EOL;
echo html_substr($str, 5, 1);

2. [代码]另外一种     跳至 [1] [2] [3] [4] [5] [全屏预览]

$str = "a1<body>b2c3<p><em>d4</em>e</p>5f6</body>g7h8";
$gn  = 7;
$i   = $j = $k = 0;
while( ($c = $str[$i++]) && $j < $gn ) 
{
    if( $c == '<')
    {
        $tag = 1;
    }
    elseif($c == '>')
    {
        if(trim($tg,'/') == 'em')
        {
            $tgs[$j-1] = '<'.$tg.'>';
        }
        else 
        {
            if($tgs[$j-1]) $ogs[$j-1] = '1|'.'<'.$tg.'>';
            else $ogs[$j-1]           = '0|'.'<'.$tg.'>';
        }
        $tag = 0;
        $tg  = '';
    }
    elseif($tag == 1)
    {
        $tg .= $c;
    }
    else
    {
        $tmp[] = $c;
        $j++;
    }
}
$ts = count($tgs);
if($ts % 2) array_pop($tgs);
foreach($tmp as $k=>$v)
{
   $ba = explode('|',$ogs[$k],2);
   if( $tgs[$k] && $ogs[$k])
   {
        if($ba[0])
        {
            $s .= $v.$tgs[$k].$ba[1];
        }   
        else $s .= $v.$ba[1].$tgs[$k];
   }
   else $s .= $v.$tgs[$k].$ba[1];
}
echo htmlspecialchars($s);

3. [代码][PHP]代码     跳至 [1] [2] [3] [4] [5] [全屏预览]

//tags : 字符串可能包含的HTML标签
//zhfw : 用来修正中英字宽参数
function wsubstr($str, $length = 0, $suffixStr = "...", $start = 0, $tags = "div|span|p", $zhfw = 0.9, $charset = "utf-8"){
//author: lael
//blog: http://hi.baidu.com/lael80
 
$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
 
$zhre['utf-8']   = "/[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$zhre['gb2312'] = "/[\xb0-\xf7][\xa0-\xfe]/";
$zhre['gbk']    = "/[\x81-\xfe][\x40-\xfe]/";
$zhre['big5']   = "/[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
 
//下面代码还可以应用到关键字加亮、加链接等,可以避免截断HTML标签发生
//得到标签位置
$tpos = array();
preg_match_all("/<(".$tags.")([\s\S]*?)>|<\/(".$tags.")>/ism", $str, $match);
$mpos = 0;
for($j = 0; $j < count($match[0]); $j ++){
$mpos = strpos($str, $match[0][$j], $mpos);
$tpos[$mpos] = $match[0][$j];
$mpos += strlen($match[0][$j]);
}
ksort($tpos);
 
//根据标签位置解析整个字符
$sarr = array();
$bpos = 0;
$epos = 0;
foreach($tpos as $k => $v){
$temp = substr($str, $bpos, $k - $epos);
if(!empty($temp))array_push($sarr, $temp);
array_push($sarr, $v);
$bpos = ($k + strlen($v));
$epos = $k + strlen($v);
}
$temp = substr($str, $bpos);
if(!empty($temp))array_push($sarr, $temp);
 
//忽略标签截取字符串
$bpos = $start;
$epos = $length;
for($i = 0; $i < count($sarr); $i ++){
if(preg_match("/^<([\s\S]*?)>$/i", $sarr[$i]))continue;//忽略标签
 
preg_match_all($re[$charset], $sarr[$i], $match);
 
for($j = $bpos; $j < min($epos, count($match[0])); $j ++){
if(preg_match($zhre[$charset], $match[0][$j]))$epos -= $zhfw;//计算中文字符
}
 
$sarr[$i] = "";
for($j = $bpos; $j < min($epos, count($match[0])); $j ++){//截取字符
$sarr[$i] .= $match[0][$j];
}
$bpos -= count($match[0]);
$bpos = max(0, $bpos);
$epos -= count($match[0]);
$epos = round($epos);
}
 
//返回结果
$slice = join("", $sarr);//自己可以加个清除空html标签的东东
if($slice != $str)return $slice.$suffixStr;
return $slice;
}

4. [代码]速度测试     跳至 [1] [2] [3] [4] [5] [全屏预览]

/**
 * 函数名 check_speed
 * 功能 统计运行时间和内存使用情况
 * 参数 $num 大于0 开始计时,等于0或缺省 停止计时并输出结果
 * 说明 本函数可以以 check_speed(运行次数, 函数名, 参数列表);
 *      方式调用。输出的结果是平均每次的耗时
 **/
function check_speed($num=0) {
  static $time;
  static $memo;
  $argc = func_num_args();
  $param = func_get_args();
 
  switch($argc) {
    case 1:
      $time = microtime(true);
      $memo = memory_get_usage();
      break;
    default:
      $time = microtime(true);
      $memo = memory_get_usage();
      $len = array_shift($param);
      $func = array_shift($param);
      for($i = 0; $i<$len; $i++)
        call_user_func_array($func, $param);
      echo '<br />' . PHP_EOL . $func;
    case 0:
      $len or $len = 1;
      echo '<br />' . PHP_EOL;
      printf("时间: %s 微秒<br />%s", number_format((microtime(true) - $time)*1000000/$len), PHP_EOL);
      printf("内存: %d<br />%s", memory_get_usage()-$memo, PHP_EOL);
  }
}


/**
 * 函数名 check_speed
 * 功能 统计运行时间和内存使用情况
 * 参数 $num 大于0 开始计时,等于0或缺省 停止计时并输出结果
 * 说明 本函数可以以 check_speed(运行次数, 函数名, 参数列表);
 *      方式调用。输出的结果是平均每次的耗时
 **/
function check_speed($num=0) {
  static $time;
  static $memo;
  $argc = func_num_args();
  $param = func_get_args();
 
  switch($argc) {
    case 1:
      $time = microtime(true);
      $memo = memory_get_usage();
      break;
    default:
      $time = microtime(true);
      $memo = memory_get_usage();
      $len = array_shift($param);
      $func = array_shift($param);
      for($i = 0; $i<$len; $i++)
        call_user_func_array($func, $param);
      echo '<br />' . PHP_EOL . $func;
    case 0:
      $len or $len = 1;
      echo '<br />' . PHP_EOL;
      printf("时间: %s 微秒<br />%s", number_format((microtime(true) - $time)*1000000/$len), PHP_EOL);
      printf("内存: %d<br />%s", memory_get_usage()-$memo, PHP_EOL);
  }
}

5. [代码]http://www.jb51.net/article/51242.htm     跳至 [1] [2] [3] [4] [5] [全屏预览]

/*
* ============================== 截取含有 html标签的字符串 =========================
* @param (string) $str   待截取字符串
* @param (int)  $lenth  截取长度
* @param (string) $repalce 超出的内容用$repalce替换之(该参数可以为带有html标签的字符串)
* @param (string) $anchor 截取锚点,如果截取过程中遇到这个标记锚点就截至该锚点处
* @return (string) $result 返回值
* @demo  $res = cut_html_str($str, 256, '...'); //截取256个长度,其余部分用'...'替换
* -------------------------------------------------------------------------------
* $ Author: Wang Jian.  |   Email: wj@yurendu.com   |   Date: 2014/03/16
* ===============================================================================
*/
function cut_html_str($str, $lenth, $replace='', $anchor='<!-- break -->'){ 
    $_lenth = mb_strlen($str, "utf-8"); // 统计字符串长度(中、英文都算一个字符)
    if($_lenth <= $lenth){
        return $str;    // 传入的字符串长度小于截取长度,原样返回
    }
    $strlen_var = strlen($str);     // 统计字符串长度(UTF8编码下-中文算3个字符,英文算一个字符)
    if(strpos($str, '<') === false){ 
        return mb_substr($str, 0, $lenth);  // 不包含 html 标签 ,直接截取
    } 
    if($e = strpos($str, $anchor)){ 
        return mb_substr($str, 0, $e);  // 包含截断标志,优先
    } 
    $html_tag = 0;  // html 代码标记 
    $result = '';   // 摘要字符串
    $html_array = array('left' => array(), 'right' => array()); //记录截取后字符串内出现的 html 标签,开始=>left,结束=>right
    /*
    * 如字符串为:<h3 id="p-b-a-b"><p><b>a</b></h3>,假设p未闭合,数组则为:array('left'=>array('h3','p','b'), 'right'=>'b','h3');
    * 仅补全 html 标签,<? <% 等其它语言标记,会产生不可预知结果
    */
    for($i = 0; $i < $strlen_var; ++$i) { 
        if(!$lenth) break;  // 遍历完之后跳出
        $current_var = substr($str, $i, 1); // 当前字符
        if($current_var == '<'){ // html 代码开始 
            $html_tag = 1; 
            $html_array_str = ''; 
        }else if($html_tag == 1){ // 一段 html 代码结束 
            if($current_var == '>'){ 
                $html_array_str = trim($html_array_str); //去除首尾空格,如 <br / > < img src="" / > 等可能出现首尾空格
                if(substr($html_array_str, -1) != '/'){ //判断最后一个字符是否为 /,若是,则标签已闭合,不记录
                    // 判断第一个字符是否 /,若是,则放在 right 单元 
                    $f = substr($html_array_str, 0, 1); 
                    if($f == '/'){ 
                        $html_array['right'][] = str_replace('/', '', $html_array_str); // 去掉 '/' 
                    }else if($f != '?'){ // 若是?,则为 PHP 代码,跳过
                        // 若有半角空格,以空格分割,第一个单元为 html 标签。如:<h2 class="a"> <p class="a"> 
                        if(strpos($html_array_str, ' ') !== false){ 
                        // 分割成2个单元,可能有多个空格,如:<h2 class="" id=""> 
                        $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2))); 
                        }else{ 
                        //若没有空格,整个字符串为 html 标签,如:<b> <p> 等,统一转换为小写
                        $html_array['left'][] = strtolower($html_array_str); 
                        } 
                    } 
                } 
                $html_array_str = ''; // 字符串重置
                $html_tag = 0; 
            }else{ 
                $html_array_str .= $current_var; //将< >之间的字符组成一个字符串,用于提取 html 标签
            } 
        }else{ 
            --$lenth; // 非 html 代码才记数
        } 
        $ord_var_c = ord($str{$i}); 
        switch (true) { 
            case (($ord_var_c & 0xE0) == 0xC0): // 2 字节 
                $result .= substr($str, $i, 2); 
                $i += 1; break; 
            case (($ord_var_c & 0xF0) == 0xE0): // 3 字节
                $result .= substr($str, $i, 3); 
                $i += 2; break; 
            case (($ord_var_c & 0xF8) == 0xF0): // 4 字节
                $result .= substr($str, $i, 4); 
                $i += 3; break; 
            case (($ord_var_c & 0xFC) == 0xF8): // 5 字节 
                $result .= substr($str, $i, 5); 
                $i += 4; break; 
            case (($ord_var_c & 0xFE) == 0xFC): // 6 字节
                $result .= substr($str, $i, 6); 
                $i += 5; break; 
            default: // 1 字节 
                $result .= $current_var; 
        } 
    } 
    if($html_array['left']){ //比对左右 html 标签,不足则补全
        $html_array['left'] = array_reverse($html_array['left']); //翻转left数组,补充的顺序应与 html 出现的顺序相反
        foreach($html_array['left'] as $index => $tag){ 
            $key = array_search($tag, $html_array['right']); // 判断该标签是否出现在 right 中
            if($key !== false){ // 出现,从 right 中删除该单元
                unset($html_array['right'][$key]); 
            }else{ // 没有出现,需要补全 
                $result .= '</'.$tag.'>'; 
            } 
        } 
    } 
    return $result.$replace; 
}
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경