程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 截取字符串函數(中文字符串)(1/2)

php 截取字符串函數(中文字符串)(1/2)

編輯:關於PHP編程

php 截取字符串函數(中文字符串) 這是一款php 截取字符串函數哦,這是一款支持中文字符串哦,它可以截取html與中西文,等混合的內容,並且把html標簽不算在字符截取之內,如果html標簽沒有閉合,程序將自動過濾多余的標簽。

php教程 截取字符串函數(中文字符串)
這是一款php 截取字符串函數哦,這是一款支持中文字符串哦,它可以截取html與中西文,等混合的內容,並且把html標簽不算在字符截取之內,如果html標簽沒有閉合,程序將自動過濾多余的標簽。
*/

function mysubstr( $str, $length ){
   
    $tagcnt = 0;
    $charcnt = 0;
    $tag = '';
    $maxlen = strlen( $str );
    $resultstr = '';
    $tagstack = array();

    for( $i = 0; $i < $length; $i++ ){
        if( $str[$i] == '<' ){

            $resultstr .= $str[$i];

            for( $j=$i; $str[$j]!='>'; $j++,$length++ ){
                $tag .= $str[$j];
            }
            $tagcnt++;
            $length++;
            $tag .= '>';
           
            //如果是開始標記,則入棧,如果是與之相對應的結束標記則出棧
            if( preg_match('/<([^/]+)?>/i', $tag, $r) ){
                echo '入棧:',htmlspecialchars($r[1]),'<br />';
                array_push($tagstack, $r[1]);
            }
            elseif( preg_match( '/'.$tagstack[count($tagstack)-1].'/', $tag ) ){
                echo '出棧:',htmlspecialchars($tagstack[count($tagstack)-1]),'<br />';
                array_pop( $tagstack );
            }

            $tag = '';
            continue;
        }

        $charcnt++;
        $resultstr .= $str[$i];
    }

   
    echo '<hr size=1>最後結果為:';

    //棧是空的直接返回
    if(empty($tagstack)){
        return $resultstr;
    }
    //否則去掉沒有結束標記的開始標記
    else{
       
        while(!empty($tagstack)){

            $tag = array_pop($tagstack);

            $index = strrpos($resultstr, $tag);

            for($i = $index-1; $resultstr[$i] != '>'; $i++ ){
                $resultstr[$i] = '';
            }

            $resultstr[$i++] = '';
       
        }

        return $resultstr;
    }
   
}

$sttime = microtime(true);

$stmem = memory_get_usage();

$str = "a1<body>b2<p>c3<em>d4</em>e5</p>f6</body>g7h8";

echo '處理結果為:<br/><hr size=1>',htmlspecialchars( mysubstr( $str, 18 ) ),'<br />';

echo "內存使用情況:",(memory_get_usage()-$stmem),'<br />';

echo "算法運行時間(microtime):",(microtime(true)-$sttime),'<br/>';

//方法二

/

**
 * 函數名 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);

1 2

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved