linux php空白字符,php去除字符串中的(特殊)空白字符

花了几天来研究这个问题,然后发现这样就可以,那就不用往下看了

function trim_blank($str){

return preg_replace('/\s/u','',$str);

}

项目中遇到的问题

php项目中,导入Excel表格,获取数据时,发现一列数据头部存在空格,赶紧加上trim来去除空格,发现无法去除。

json_encode数据后发现数据头部出现的空格编码为’\u00a0′.

对于只是简单的取出此空格的方法,想出来三种:

/**

* 方法一

* 直接把空白字符复制出来,复制到preg_replacede的第一个参数中

*/

preg_replace('/ /','',$str);

/**

* 方法二

* 转码后去除

*/

$str = ' 123123';

$str = json_encode($str); //转码为 '\u00a0123123'

preg_replace('/\\\u00a0/','',$str);

/**

* 方法三

*/

preg_replace('/\x{00a0}/u','',$str);

额外说下preg_replace中的三个反斜杠的问题:

官方文档 http://php.net/manual/zh/regexp.reference.escape.php 中写的“比较清楚”:译注: “/\/”, 首先它作为字符串,反斜线会进行转义, 那么转义后的结果是/\/,这个才是正则表达式引擎拿到的模式, 而正则表达式引擎也认为 \ 是转义标记,它会将分隔符 / 进行转义, 从而得到的是一个错误,因此,需要 4 个反斜线才可以匹配一个反斜线。

当然,实际使用发现三个‘\’也是可以的

关于空白字符再多查找下资料

php的trim()方法,默认移除两侧的以下字符:

符号

说明

“\0”

NULL

“\t”

制表符

“\n”

换行

“\x0B”

垂直制表符

“\r”

回车

” “

空格

使用preg_replace()中的\s正则替换:

文档说是 任意空白字符,但是经测试并不能移除上边的 \u00a0,也是只能移除一般的空白字符.

最后,经过详细测试搜索,http://php.net/manual/zh/regexp.reference.character-classes.php 中关于字符类的描述中发现一句话

空白字符有HT(9)、 LF(10)、VT(11)、 FF(12)、CR(13)、space(32)。 注意, 这个列表包含了垂直制表符。这使得space不同于\s, 因为它不包含垂直制表符(为了向 perl 兼容)

这使得space不同于\s中space指代的应该是空白字符类,所以\s【应该】也只是可以去除这些普通的空白字符。

那么,有哪些空白字符呢?

没有搜到具体的说有哪些空白字符的东西,但是js的正则表达式里\s看可以匹配的空白范围还是比较广泛的

//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

Matches a single white space character, including space, tab, form feed, line feed. Equivalent to [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff].

For example, /\s\w*/ matches ' bar' in "foo bar."

其中\u2028表示行分隔符,\u2029表示段落分隔符,\ufeff表示字节顺序标记

此处又是知识点啊

https://zhuanlan.zhihu.com/p/27222802

字节顺序标记:

即BOM(byte-order mark)。最初,字符U+FEFF如果出现在字节流的开头,则用来标识该字节流的字节序——是高位在前还是低位在前;如果它出现在字节流的中间,则表达为该字符的原义——(ZERO WIDTH NO-BREAK SPACE零宽度无断空白)。从Unicode 3.2开始,U+FEFF只能出现在字节流的开头,且只能用于标识字节序,就如它的别名——字节序标记——所表示的意思一样;除此以外的用法已被舍弃。取而代之的是,使用U+2060来表示零宽度不中断空格。

所以暂且已js的\s为准来去掉空白字符。

如果还是用正则替换的话:

/**

* 正则中 \xhh 十六进制编码字符

* 模式修正符 u 官网给的描述是“此修正符打开一个与 perl 不兼容的附加功能。 模式和目标字符串都被认为是 utf-8 的”[http://php.net/manual/zh/reference.pcre.pattern.modifiers.php]

* 此处应该也可以把 \u2060加上

*/

function trim_blank($str){

//partern的第一位是个空格

$partern = '/[ \x{00a0}\x{1680}\x{2000}-\x{200a}\x{2028}\x{2029}\x{202f}\x{205f}\x{3000}\x{feff}\x{2060}]/u';

return preg_replace($partern, '', $str);

}

//但一个不小心的尝试,发现这样也可以。。。囧。。。

function trim_blank($str){

return preg_replace('/\s/u','',$str);

}

//测试

$str = '| | | | | | | | |';

echo json_encode($str); //"| |\u00a0|\u1680|\u2000|\u2001|\u200a|\u205f|\u3000|"

echo remove_white_space($str); //"|||||||||" 两个方法去除效果一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值