PHP 实现给中文之间加空格问题,有木有大神会的

2017-06-07 10:21:13 +08:00
 3132702442

我要用 PHP 实现给一行字符串中,前面和后面是中文、中文符号的时候就加空格,是英文、数字、英文符号的时候就不加,例子:

原来:这个是一些什么汉子。
转后:这 个 是 一 些 什 么 汉 子 。
-----------------------------------
原来:这个是 ui 一些什 b 么汉子。
转后:这 个 是 ui 一 些 什 b 么 汉 子 。
-----------------------------------
原来:这个是 ui 一 些 999 什 A 么汉子。
转后:这 个 是 ui 一 些 999 什 A 么 汉 子 。

然后 PHP 文件是 gbk 的编码,对于的中文也是 gbk

5365 次点击
所在节点    PHP
19 条回复
yplam
2017-06-07 10:35:04 +08:00
感觉 preg_replace 就可以,用字节序列的方式去匹配
jarlyyn
2017-06-07 10:37:01 +08:00
中文的标准是什么?
3132702442
2017-06-07 11:15:49 +08:00
中文的标准是就是这些汉子啥,还有一些汉子的符号,比如《:、“ [等等之类的,不知道我描述对了没
Nicksxs
2017-06-07 11:23:04 +08:00
用结巴分词吧
maskerTUI
2017-06-07 11:28:46 +08:00
preg_replace + 正则匹配可以做到
3132702442
2017-06-07 12:05:24 +08:00
结巴分词是什么?
em70
2017-06-07 12:09:03 +08:00
一个正则就搞定了啊,下面是匹配汉字的表达式
/^[\x{4e00}-\x{9fa5}]+$/u
KylinRoc
2017-06-07 12:14:29 +08:00
3132702442
2017-06-07 14:09:05 +08:00
@KylinRoc 你提供的这个的话算是单词句子分句吧?
KylinRoc
2017-06-07 14:33:53 +08:00
@3132702442 看错了你的需求……
3132702442
2017-06-07 14:34:55 +08:00
@KylinRoc 呃呃
ic2y
2017-06-07 17:06:57 +08:00
ic2y
2017-06-07 17:15:06 +08:00
@3132702442 跟 gbk utf8 之类的编码相关的,基本都是 mb_xxx 开头的
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;
}
```

实际证明, 中文的句号后面都有个空格.
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 下的情况。
3132702442
2017-06-08 10:24:06 +08:00
@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;
}
}···
3132702442
2017-06-08 10:26:28 +08:00
@wudanyang 嗯,你这思路我基本上也是这么想的,去判断前后是不是中文,然后加空格,然后 gbk 中文这种的不好分割啊,分割之后就是乱码了。
3132702442
2017-06-12 11:10:45 +08:00
想结帖了。。。
3132702442
2017-06-12 14:56:14 +08:00
最新可行代码:
```
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;
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/366551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX