项目经理给我抛了个BUG... 发现有微信昵称为空白的用户,让我过滤掉,如果昵称为空就系统生成一个默认用户昵称,下面我们就来说一说关于php登录成功显示用户名?我们一起去了解并探讨一下这个问题吧!

php登录成功显示用户名(php中怎么过滤微信昵称为空白的用户)

php登录成功显示用户名

项目经理给我抛了个BUG... 发现有微信昵称为空白的用户,让我过滤掉,如果昵称为空就系统生成一个默认用户昵称

花了很久时间来研究这个问题,然后直接自信满满的写

function trim_blank($str){ return preg_replace('/\s/u','',$str); }

发现问题依然没能解决,我猜它是一个空白的特殊字符,json_encode下看看字符编码

$str = "ㅤ"; $s = json_encode($str); var_dump($s);

运行结果:

string(8) ""\u3164""

正则表达式去匹配,三种写法如下:

/** * 方法一 * 直接把空白字符复制出来,复制到preg_replacede的第一个参数中 */ preg_replace('/ㅤ/','',$str); /** * 方法二 * 转码后去除 */ $str = 'ㅤ'; $str = json_encode($str); //转码 preg_replace('/\\\u3164/','',$str); /** * 方法三 */ preg_replace('/\x{u3164}/u','',$str);

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看可以匹配的空白范围还是比较广泛的

//http://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表示字节顺序标记

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

说了那么多废话,下面给完整代码

function trim_blank($str){ $partern = '/[\x{00a0}\x{1680}\x{2000}-\x{200a}\x{2028}\x{2029}\x{202f}\x{205f}\x{3000}\x{feff}\x{2060}\x{3164}]/u'; return preg_replace($partern, '', $str); }