PHP封装函数把字符串分割成多段词条

方文锋  2020-06-03 15:01:54  1237  首页学习PHP

 <?php

class Configs{
    static $config=array();
    
    /**
     * 字符串截取和返回字符串的长度
     * @param string $str 要截取的字符串
     * @param int $start 字符串截取的初始位置,从0开始
     * @param int $length 字符串截取的长度
     * @param string $charset 字符串编码
     * @param bool $suffix 是否添加后缀
     * @param bool $strlen 是否返回字符串的长度(false不返回,true返回)
     * @return int|string
     */
    static public function my_substr($str, $start = 0, $length, $charset = 'utf-8', $suffix = true, $strlen = false)
    {
        $charset || ($charset = 'utf-8');
        //正则表达式匹配编码
        $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])/";
        //返回字符串长度
        if ($strlen) {
            if (function_exists('mb_strlen')) {
                $count = mb_strlen($str, $charset);
            } elseif (function_exists('iconv_strlen')) {
                $count = iconv_strlen($str, $charset);
            } else {
                preg_match_all($re[$charset], $str, $match);
                $count = count($match[0]);
            }
            return $count;
        }
        //截取字符串
        if (function_exists("mb_substr"))
            $slice = mb_substr($str, $start, $length, $charset);
        elseif (function_exists('iconv_substr')) {
            $slice = iconv_substr($str, $start, $length, $charset);
            if (false === $slice) {
                $slice = '';
            }
        } else {
            preg_match_all($re[$charset], $str, $match);
            $slice = join("", array_slice($match[0], $start, $length));
        }
        //字数不满添加后缀 ...
        if ($suffix) {
            $count = self::my_substr($str, $start, $length, $charset, false, true);
            if ($count > $length) {
                return $slice . '......';
            } else {
                return $slice;
            }
        } else {
            return $slice;
        }
    }

    /**
     * 返回字符串长度
     * @param string $str
     * @param string $charset
     * @return int
     */
    static public function my_strlen($str, $charset = 'utf-8')
    {
        $charset || ($charset = 'utf-8');
        //正则表达式匹配编码
        $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])/";

        //返回字符串长度
        if (function_exists('mb_strlen')) {
            $count = mb_strlen($str, $charset);
        } elseif (function_exists('iconv_strlen')) {
            $count = iconv_strlen($str, $charset);
        } else {
            preg_match_all($re[$charset], $str, $match);
            $count = count($match[0]);
        }
        return $count;
    }

    /**
     * 字符串分隔
     * @param string $str
     * @param int $split_length
     * @param string $charset
     * @return array|array[]|bool|false|string[]
     */
    static public function my_str_split($str, $split_length = 1, $charset = 'utf-8')
    {
        if (func_num_args() == 1 && strtolower($charset) === 'utf-8') {
            return preg_split('/(?<!^)(?!$)/u', $str);
        }
        if ($split_length < 1) {
            return false;
        }
        $len = self::my_strlen($str, $charset);
        $arr = array();
        for ($i = 0; $i < $len; $i += $split_length) {
            $s = self::my_substr($str, $i, $split_length, $charset, false);
            $arr[] = $s;
        }
        return $arr;
    }

    /**
     * 把搜索词分割成多段并存储(存在 $save_arr 参数里面),左->右,字数由多到少,$save_arr 最终是一个二维数组
     * @param int $length 截取的长度
     * @param array $array 一维数组
     * @param $save_arr
     */
    static public function search_search1($length, $array, &$save_arr){
        for ($i = 0, $len = count($array); $i < $len; $i++) {
            ($i + $length <= $len) && ($save_arr[] = array_slice($array, $i, $length));
        }
    }

    /**
     * 搜索词分割
     * @param string $keyword 搜索词
     * @param int|boolean $toStirng [布尔值或者 0,1]
     * @return bool|array
     */
    static public function search_keywords($keyword, $toStirng = 0){
        if(!$keyword){return false;}
        $array = self::my_str_split($keyword);
        $len = count($array);
        for($i = $len;$i>0;$i--){
            self::search_search1($i,$array,$save_arr);
        }
        if($toStirng){
            for($i=0,$len=count($save_arr);$i<$len;$i++){
                $save_arr[$i] = join('',$save_arr[$i]);
            }
        }
        return $save_arr ? $save_arr : false;
    }

    /**
     * 浏览器友好的变量输出
     * @param mixed $var 变量
     * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
     * @param string $label 标签 默认为空
     * @param boolean $strict 是否严谨 默认为true
     * @return void|string
     */
    static public function dump($var, $echo=true, $label=null, $strict=true){
        $label = ($label === null) ? '' : rtrim($label) . ' ';
        if (!$strict) {
            if (ini_get('html_errors')) {
                $output = print_r($var, true);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            } else {
                $output = $label . print_r($var, true);
            }
        } else {
            ob_start();
            var_dump($var);
            $output = ob_get_clean();
            if (!extension_loaded('xdebug')) {
                $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            }
        }
        if ($echo) {
            echo($output);
            return null;
        }else
            return $output;
    }

    static public function __callStatic($name, $arguments)
    {
        // TODO: Implement __callStatic() method.
        $className = self::class;
        var_dump("方法 $className::$name(".join(', ',$arguments).") 不可访问或不存在");
    }
}