
我要用 PHP 实现给一行字符串中,前面和后面是中文、中文符号的时候就加空格,是英文、数字、英文符号的时候就不加,例子:
原来:这个是一些什么汉子。 转后:这 个 是 一 些 什 么 汉 子 。 ----------------------------------- 原来:这个是 ui 一些什 b 么汉子。 转后:这 个 是 ui 一 些 什 b 么 汉 子 。 ---------------------------------- 原来:这个是 ui 一 些 999 什 A 么汉子。 转后:这 个 是 ui 一 些 999 什 A 么 汉 子 。
然后 PHP 文件是 gbk 的编码,对于的中文也是 gbk
1 yplam 2017-06-07 10:35:04 +08:00 感觉 preg_replace 就可以,用字节序列的方式去匹配 |
2 jarlyyn 2017-06-07 10:37:01 +08:00 中文的标准是什么? |
3 3132702442 OP 中文的标准是就是这些汉子啥,还有一些汉子的符号,比如《:、“ [等等之类的,不知道我描述对了没 |
4 Nicksxs 2017-06-07 11:23:04 +08:00 用结巴分词吧 |
5 maskerTUI 2017-06-07 11:28:46 +08:00 preg_replace + 正则匹配可以做到 |
6 3132702442 OP 结巴分词是什么? |
7 em70 2017-06-07 12:09:03 +08:00 via Android 一个正则就搞定了啊,下面是匹配汉字的表达式 /^[\x{4e00}-\x{9fa5}]+$/u |
8 KylinRoc 2017-06-07 12:14:29 +08:00 |
9 3132702442 OP @KylinRoc 你提供的这个的话算是单词句子分句吧? |
10 KylinRoc 2017-06-07 14:33:53 +08:00 @3132702442 看错了你的需求…… |
11 3132702442 OP @KylinRoc 呃呃 |
12 ic2y 2017-06-07 17:06:57 +08:00 |
13 ic2y 2017-06-07 17:15:06 +08:00 @3132702442 跟 gbk utf8 之类的编码相关的,基本都是 mb_xxx 开头的 |
14 wudanyang 2017-06-07 18:41:57 +08:00 我提供个思路, 将字符串转为数组, 然后对数组的元素判断是否为 [数字 /字母 /符号]: ``` function ch2arr($str) { $length = mb_strlen($str, 'utf-8'); $array = []; for ($i=0; $i<$length; $i++) $array[] = mb_substr($str, $i, 1, 'utf-8'); return $array; } $str = '这个是 ui 一些什 b 么汉子。'; $arr= ch2arr($str); var_dump($arr); $pattern = '/^[\s\w+]$/'; foreach ($arr as $key => $value) { echo !preg_match($pattern, $value) && !preg_match($pattern, $arr[$key+1]) ? $value.' ' : $value; } ``` 实际证明, 中文的句号后面都有个空格. |
15 hanzhao 2017-06-07 19:45:10 +08:00 $str = '这个是 ui 一 些 999 什 A 么汉子。'; $str = preg_replace("/([\x{4e00}-\x{9fa5}])/u", "\\1 ", $str); $res = preg_replace ( "/\s(?=\s)/","\\1", $str); //这 个 是 ui 一 些 999 什 A 么 汉 子 。 utf-8 下可行,没试 GBK 下的情况。 |
16 3132702442 OP @hanzhao utf 文件下面我有个代码是可行的,但是 gbk 的我还没找到。 utf8 文件的 php 可行代码: function str_split_unicode($str, $l = 0) { if ($l > 0) { $ret = array(); $len = mb_strlen($str, "GBK"); for ($i = 0; $i < $len; $i += $l) { $ret[] = mb_substr($str, $i, $l, "GBK"); } return $ret; } return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY); } $s = '言归正传,我要用 PHP 实现给一行字符 q1 串 gfg 中,前面和后面是中文、中文符 11 号的时候就加 333 空格,是英文、数字、英文符号的时候就不加'; $a = str_split_unicode($s); $asii = range('!', '~'); $is_ascii = true; foreach ($a as $value) { if (in_array($value, $asii)) { echo $value; $is_ascii = true; }else{ echo $is_ascii ? '' : ' ' , $value; $is_ascii = false; } } |
17 3132702442 OP @wudanyang 嗯,你这思路我基本上也是这么想的,去判断前后是不是中文,然后加空格,然后 gbk 中文这种的不好分割啊,分割之后就是乱码了。 |
18 3132702442 OP 想结帖了。。。 |
19 3132702442 OP 最新可行代码: ``` function set_kg_webname($str,$symbol = ' '){ $sss = ''; $arr = ch2arr($str); foreach ($arr as $i=>$ch){ if(preg_match('/[\x80-\xff]+/',$ch) && preg_match('/[\x80-\xff]+/',$arr[($i-1)])){ $sss .=$symbol.$ch; } else{ $sss .=$ch; } } return $sss; } function ch2arr($str){ $array = array(); $hou=array("","","","",""); $qian=array(" "," ","\t","\n","\r"); $str = str_replace($qian,$hou,$str); $length = mb_strlen($str, 'gbk'); if($length<9)return $array; for ($i=0; $i<$length; $i++) $array[] = mb_substr($str, $i, 1, 'gbk'); return $array; } ``` |