五月 25th, 2009php分析字符串成单词
此文章来源于后羿之弓,转载请注明出处
用php来尝试给英文进行分词,欢迎大家拍砖,如哪位看官有不错的算法,希望不吝赐教 (zhouyuhi@gmail.com)
简单的按空白字符切割,则代码如下:
- function splitStrToArr2($str,&$strArr){
- preg_match_all('/\S+/',$str,$strMatch1);
- foreach ($strMatch1[0] as $str){
- $strArr[] = $str;
- }
- }
这样显然是不行的。示例如he say:”xxxxx”.
那我们来稍微精确点儿,算一下首字(循环处理时尾字变成首字),如果首字不是数组或字母,则单独看做一个单词,考虑到可能有未知字符,所以用宽字符处理,代码如下。
- mb_internal_encoding("UTF-8");
- function splitStrToArr($str,&$strArr){
- preg_match_all('/\S+/',$str,$strMatch1);
- foreach ($strMatch1[0] as $str){
- $strTmpArr = splitStrToWord($str);
- foreach ($strTmpArr as $arr){
- $strArr[] = $arr;
- }
- }
- }
- function splitStrToWord($str){
- if(mb_strlen($str)<2){
- return array($str);
- }
- $result = array();
- $firstChar = mb_substr($str,0,1);
- $charCode = ord($firstChar);
- if(($charCode>=65 && $charCode <=90) || ($charCode>=97 && $charCode <=122) || ($charCode>=48 && $charCode <=57)){
- preg_match('/([\w]+([\'\-]?[\w\-]*)*)/',$str,$match);
- if($match[0]){
- $result[] = $match[0];
- if($str != $match[0]){
- $result = array_merge($result,splitStrToWord(mb_substr($str,strlen($match[0]))));
- }
- }
- }else{
- $result[] = $firstChar;
- $result = array_merge($result,splitStrToWord(mb_substr($str,1)));
- }
- return $result;
- }