php实现的中文分词类完整实例

 更新时间:2017年7月6日 23:34  点击:1429
小编推荐的这篇文章详细介绍了php实现的中文分词类完整实例,非常有用,感兴趣的同学快来看看吧。

 

 代码如下复制代码

classSegmentation {

  var$options=array('lowercase'=> TRUE,

  'segment_english'=> FALSE);

  var$dict_name='Unknown'

  var$dict_words=array();

  functionsetLowercase($value) {

    if($value) {

      $this->options['lowercase'] = TRUE;

    }else{

      $this->options['lowercase'] = FALSE;

    }

    returnTRUE;

  }

  functionsetSegmentEnglish($value) {

    if($value) {

      $this->options['segment_english'] = TRUE;

    }else{

      $this->options['segment_english'] = FALSE;

    }

    returnTRUE;

  }

  functionload($dict_file) {

    if(!file_exists($dict_file)) {

      returnFALSE;

    }

    $fp=fopen($dict_file,'r');

    $temp=fgets($fp, 1024);

    if($temp=== FALSE) {

      returnFALSE;

    }else{

      if(strpos($temp,"\t") !== FALSE) {

        list ($dict_type,$dict_name) =explode("\t", trim($temp));

      }else{

        $dict_type= trim($temp);

        $dict_name='Unknown'

      }

      $this->dict_name =$dict_name;

      if($dict_type!=='DICT_WORD_W') {

        returnFALSE;

      }

    }

    while(!feof($fp)) {

      $this->dict_words[rtrim(fgets($fp, 32))] = 1;

    }

    fclose($fp);

    returnTRUE;

  }

  functiongetDictName() {

    return$this->dict_name;

  }

  functionsegmentString($str) {

    if(count($this->dict_words) === 0) {

      returnFALSE;

    }

    $lines=explode("\n",$str);

    return$this->_segmentLines($lines);

  }

  functionsegmentFile($filename) {

    if(count($this->dict_words) === 0) {

      returnFALSE;

    }

    $lines= file($filename);

    return$this->_segmentLines($lines);

  }

  function_segmentLines($lines) {

    $contents_segmented=''

    foreach($linesas$line) {

      $contents_segmented.=$this->_segmentLine(rtrim($line)) ." \n";

    }

    do{

      $contents_segmented=str_replace(' ',' ',$contents_segmented);

    }

    while(strpos($contents_segmented,' ') !== FALSE);

    return$contents_segmented;

  }

  function_segmentLine($str) {

    $str_final=''

    $str_array=array();

    $str_length=strlen($str);

    if($str_length> 0) {

      if(ord($str{$str_length-1}) >= 129) {

        $str.=' '

      }

    }

    for($i=0;$i<$str_length;$i++) {

      if(ord($str{$i}) >= 129) {

        $str_array[] =$str{$i} .$str{$i+1};

        $i++;

      }else{

        $str_tmp=$str{$i};

        for($j=$i+1;$j<$str_length;$j++) {

          if(ord($str{$j}) < 129) {

            $str_tmp.=$str{$j};

          }else{

            break;

          }

        }

        $str_array[] =array($str_tmp);

        $i=$j- 1;

      }

    }

    $pos=count($str_array);

    while($pos> 0) {

      $char=$str_array[$pos-1];

      if(is_array($char)) {

        $str_final_tmp=$char[0];

        if($this->options['segment_english']) {

          $str_final_tmp= preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f]+)/"," $1 ",$str_final_tmp);

$str_final_tmp= preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])/"," $1 $2 ",$str_final_tmp);

        }

        if($this->options['lowercase']) {

          $str_final_tmp=strtolower($str_final_tmp);

        }

        $str_final=" $str_final_tmp$str_final";

        $pos--;

      }else{

        $word_found= 0;

        $word_array=array(0 =>'');

        if($pos< 4) {

          $word_temp=$pos+ 1;

        }else{

          $word_temp= 5;

        }

        for($i=1;$i<$word_temp;$i++) {

          $word_array[$i] =$str_array[$pos-$i] .$word_array[$i-1];

        }

        for($i=($word_temp-1);$i>1;$i--) {

          if(array_key_exists($word_array[$i],$this->dict_words)) {

            $word_found=$i;

            break;

          }

        }

        if($word_found) {

          $str_final=" $word_array[$word_found]$str_final";

          $pos=$pos-$word_found;

        }else{

          $str_final=" $char$str_final";

          $pos--;

        }

      }

    }

    return$str_final;

  }

}

?>

 

小编推荐的这篇文章介绍了php加密之discuz内容经典加密方式实例详解,非常实用,有兴趣的同学快来看看吧。

本文实例讲述了php加密之discuz内容经典加密方式。分享给大家供大家参考,具体如下:

导读:有的时候,我们希望对表里的某些敏感字段进行加密,想了好长时间没有比较好的解决方案,后台在网上查了查,放心discuz论坛的这种方案对这种情况解决的不错,特copy过来,给大家分享一下,代码如下:

 

 代码如下 复制代码

header ("Content-type:text/html;charset=UTF-8");

echo$string='花园路888号';

echo'<hr/>加密有效期10秒,密文内容:';

// $string='1111';

$sss=authcode($string,'','',10);

echo$sss;

echo'<hr/>加密后立即解密:...';

echoauthcode($sss);

sleep(6);

echo'<hr/>6秒后解密...';

$aaaa=authcode($sss);

var_dump($aaaa);

sleep(5);

echo'<hr/>再次5秒后解密...';

$aaaa=authcode($sss);

var_dump($aaaa);

/**

 *

 * @param string $string    明文或密文字符串

 * @param string $operation    DECODE表示解密,其它表示加密

 * @param string $key    密钥

 * @param int $expiry    密文有效期,0代码永不过期

 * @return string

 */

functionauthcode($string,$operation='DECODE',$key='',$expiry= 0) {

    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙

    $ckey_length= 4;

    // 密匙

    $key= md5 ($key?$key:$GLOBALS['discuz_auth_key'] );

    // 密匙a会参与加解密

    $keya= md5 (substr($key, 0, 16 ) );

    // 密匙b会用来做数据完整性验证

    $keyb= md5 (substr($key, 16, 16 ) );

    // 密匙c用于变化生成的密文

    $keyc=$ckey_length? ($operation=='DECODE'?substr($string, 0,$ckey_length) :substr( md5 ( microtime () ), -$ckey_length)) :'';

    // 参与运算的密匙

    $cryptkey=$keya. md5 ($keya.$keyc);

    $key_length=strlen($cryptkey);

    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性

    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确

    $string=$operation=='DECODE'?base64_decode(substr($string,$ckey_length) ) : sprintf ('0d',$expiry?$expiry+ time () : 0 ) .substr( md5 ($string.$keyb), 0, 16 ) .$string;

    $string_length=strlen($string);

    $result='';

    $box= range ( 0, 255 );

    $rndkey=array();

    // 产生密匙簿

    for($i= 0;$i<= 255;$i++) {

        $rndkey[$i] = ord ($cryptkey[$i%$key_length] );

    }

    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度

    for($j=$i= 0;$i< 256;$i++) {

        $j= ($j+$box[$i] +$rndkey[$i]) % 256;

        $tmp=$box[$i];

        $box[$i] =$box[$j];

        $box[$j] =$tmp;

    }

    // 核心加解密部分

    for($a=$j=$i= 0;$i<$string_length;$i++) {

        $a= ($a+ 1) % 256;

        $j= ($j+$box[$a]) % 256;

        $tmp=$box[$a];

        $box[$a] =$box[$j];

        $box[$j] =$tmp;

        // 从密匙簿得出密匙进行异或,再转成字符

        $result.=chr( ord ($string[$i] ) ^ ($box[($box[$a] +$box[$j]) % 256]) );

    }

    if($operation=='DECODE') {

        // substr($result, 0, 10) == 0 验证数据有效性

        // substr($result, 0, 10) - time() > 0 验证数据有效性

        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0,

        // 16) 验证数据完整性

        // 验证数据有效性,请看未加密明文的格式

        if((substr($result, 0, 10 ) == 0 ||substr($result, 0, 10 ) - time () > 0) &&substr($result, 10, 16 ) ==substr( md5 (substr($result, 26 ) .$keyb), 0, 16 )) {

            returnsubstr($result, 26 );

        }else{

            return'';

        }

    }else{

        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因

        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码

        return$keyc.str_replace('=','',base64_encode($result) );

    }

}

 

以上代码运行结果:

花园路888号

加密有效期10秒,密文内容:ce9eelLd6jpd7hZJTRg+/fgg8cD9VG+1NsHvkavEKhdvhk7jcfDoQTYSAAw

加密后立即解密:...花园路888号

6秒后解密...

string'花园路888号' (length=15)

再次5秒后解密...

string'' (length=0)

本文分享了PHP中生成UUID的自定义函数,有兴趣的同学快来看看吧。

UUID 全称是 Universally unique identifier,它是一种识别符,使用任意的计算机都可以生成,不需要一个中央数据库进行管理,即可以保证几乎没有重复的几率。而 UUID 的值域之大,据说给世界上每一粒沙子分配一个 UUID,也不会有重复的。

最近在改 WordPress 的代码,需要用到 UUID。但是,PHP 中居然没有生成 UUID 的函数,只好自己写一个。

 代码如下复制代码

if(!function_exists('com_create_guid')) {

 functioncom_create_guid() {

  returnsprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

    mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

    mt_rand( 0, 0xffff ),

    mt_rand( 0, 0x0fff ) | 0x4000,

    mt_rand( 0, 0x3fff ) | 0x8000,

    mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )

  );

 }

}

上述代码可以生成一个 UUID version 4。UUID 目前有 5 个版本,其中第四版是完全随机的,生成起来比较容易。而其中的 com_create_guid,是 Windows 中 PHP 的一个函数,它直接调用 COM 的 CreateGuid 函数来生成 UUID,但是在 Linux 没有对应的函数库,只好自己写了。为了方便在不同的平台上使用,就创建了一个同名的函数。其它的代码就是生成随机数了。

至于用法,就直接调用 com_create_guid() 即可。

小编分享的这篇文章介绍了获知PHP程序占用多少内存的方法,有兴趣的同学可以参考一下文中所给代码。

下面是使用示例: 

 代码如下复制代码
<?php 
echo memory_get_usage(), '
'; // 313864 
$tmp = str_repeat('http://www.nowamagic.net/', 4000); 
echo memory_get_usage(), '
'; // 406048 
unset($tmp); 
echo memory_get_usage(); // 313952 
?>

上面的程序后面的注释代表了它们的输出(单位为 byte(s)),也就是当时 PHP 脚本使用的内存(不含 memory_get_usage() 函数本身占用的内存)。
由上面的例子可以看出,要想减少内存的占用,可以使用 PHP unset() 函数把不再需要使用的变量删除。类似的还有:PHP mysql_free_result() 函数,可以清空不再需要的查询数据库得到的结果集,这样也能得到更多可用内存。
PHP memory_get_usage() 函数还可以有个参数,$real_usage,其值为布尔值。默认为 FALSE,表示得到的内存使用量不包括该函数(PHP 内存管理器)占用的内存;当设置为 TRUE 时,得到的内存为不包括该函数(PHP 内存管理器)占用的内存。
所以在实际编程中,可以用 memory_get_usage() 函数比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。
贴个使用函数:

 代码如下复制代码
if (!function_exists('memory_get_usage')) 

/** 
+---------------------------------------------------------- 
* 取得内存使用情况 
+---------------------------------------------------------- 
* @return integer 
+---------------------------------------------------------- 
*/ 
function memory_get_usage() 

$pid = getmypid(); 
if (IS_WIN) 

exec('tasklist /FI "PID eq ' . $pid . '" /FO LIST', $output); 
return preg_replace('/[^0-9]/', '', $output[5]) * 1024; 

else 

exec("ps -eo%mem,rss,pid | grep $pid", $output); 
$output = explode(" ", $output[0]); 
return $output[1] * 1024; 


}

再来个函数使用例子:

 代码如下复制代码
<?php 
//memory_get_usage(); 
$m1 = memory_get_usage(); 
echo '
m1:',$m1;//58096 
$a = 'hello'; 
$b = str_repeat($a,1000); 
$m2 = memory_get_usage(); 
echo '
m2:',$m2;//63424 
unset($b); 
$m3 = memory_get_usage(); 
echo '
m3:',$m3;//58456 
?>
[!--infotagslink--]

相关文章

  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Mysql在debian系统中不能插入中文的终极解决方案

    在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • linux mint 下mysql中文支持问题

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • php中把unicode编码转化为中文

    小编在网上看到最多的就是汉字转换unicode编码了,今天我们看到一个反过来的操作就是把unicode转换成中文了,下面一起来看看 这两天帮别人开发微信平台好友板块,存...2016-11-25
  • php 判断是否是中文/英文/数字示例代码

    复制代码 代码如下: $str='asb天水市12'; if (preg_match("/^[/x7f-/xff]+$/", $str)){ echo '全部是汉字'; }else { echo '不全是汉字'; } /** PHP自带的判断是否是中文, eregi('[^/x00-/x7F]', $str ) //中文 ereg...2013-10-04
  • php中文转换成拼音代码

    <?php教程 function cn2pinyin($_string, $_code='gb2312') { $_datakey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|b...2016-11-25
  • JavaScript过滤字符串中的中文与空格方法汇总

    这篇文章主要介绍了JavaScript过滤字符串中的中文与空格方法汇总 的相关资料,需要的朋友可以参考下...2016-03-09
  • three.js显示中文字体与tween应用详析

    这篇文章主要给大家介绍了关于three.js显示中文字体与tween应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-04
  • php 根据啊拉伯数字转变成大写中文数字

    // 原是是根据用户输入的数字判断再转换成想要的大写数字,如果我们先把大小写存在一个数组,再判断进行转换就OK了。 $data = $_POST['rmb']; if (!ereg("^[0-9.]",$dat...2016-11-25
  • PHP把16进制的编码转为中文程序代码

    今天在做公司的项目的时候,遇到一个问题,群聊天记录存入数据库的时候把聊天记录及央视使用16进制转换,我在做将聊天记录导出为text文本的时候,需要将聊天记录先从16进制转...2016-11-25
  • 如何正确统计中文字数?

    PHP代码:-------------------------------------------------------------------------------- function ccStrLen($str) #计算中英文混合字符串的长度 { $ccLe...2016-11-25
  • 深度解析MySQL 5.7之中文全文检索

    InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的。但对于像中文,日文和韩文来说,没有这样的分隔符。一个词可以由多个字来组成,所以我们需要用不同的方式来处理。在MySQL 5.7.6中我们能使用一个新的全文索引插件来处理它们:n-gram parser。...2017-01-09
  • JS验证逗号隔开可以是中文字母数字

    这篇文章主要介绍了JS验证逗号隔开可以是中文字母数字 的相关资料,需要的朋友可以参考下...2016-04-24
  • JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xh...2013-10-07