php explode phparray_merge

php explode phparray_merge

在日常开发中,我们经常会遇到这样的问题,就是有些PHP的问题,说起来看似简单明了,但用起来却踩坑了。例如,我列出了以下项目:

1.因为用了单引号,用了“\r\n”作为分隔符,所以用PHP函数explode来拆分字符串,不能正常拆分。

原因:这涉及到单引号和双引号的区别。在单引号中,不能解析反斜杠。所以在使用explode segmentation的时候,如果使用单引号的话,\r\n会被当作一个字符串而不是一个换行符,所以此时不能正常分段。

当字符串包含{}时,也存在类似的问题。在字符串中,为了成功解析{}中包含的变量,字符串必须用双引号括起来。

2.由于BOM头的原因,使用PHP函数json_decode无法成功解析json字符串。

原因:UTF-8编码文件可以分为两种格式:无BOM和无BOM。BOM是什么?“EF BB BF”的三个字节叫做BOM,BOM的全称叫做“字节序Mard”。在UTF-8文件中,经常用BOM来表示这个文件是UTF-8文件,BOM的本意其实是用来表示utf16中的高低字节序列。在字节流之前有BOM意味着使用低位字节序列(低位字节在前面),而utf8不需要考虑字节序列,所以实际上有BOM或者没有BOM都是可能的。UTF-8以字节为编码单位,所以不存在字节顺序的问题。UTF-16以两个字节作为编码单位。在解释一个UTF-16文本之前,我们必须首先弄清楚每个编码单元的字节顺序。比如a“奎”的Unicode编码是594E,“B”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,是“Kui”还是“B”?

如果保存文件时选择使用BOM,页面显示将会异常。一般来说,php不支持BOM,php文件应该保存为UTF-8无BOM类型,所以在保存UTF8编码的PHP文件时不要使用BOM。

3.因为正斜杠和反斜杠,PHP函数basename的使用是无效的。

我们经常使用PHP函数basename从包含文件完整路径的字符串中获取基本文件名,但是有时候你会发现basename函数无法生效,尤其是在window系统和linux系统之间切换的时候。原来basename函数是受操作系统影响的。在Windows中使用时,斜杠(/)和反斜杠(\)都可以用作目录分隔符,但在其他环境中只能使用斜杠(/)。所以如果在窗口系统中使用反斜杠(\),到其他系统就有问题了。

为了避免这种影响,最好使用斜杠(/)作为目录分隔符。对于使用named 空的情况,最好先使用str_replace函数将反斜杠(\)替换为斜杠(/)。

4.过多移除trim系列功能

trim函数的基本用法是删除最外面的空格、换行符等。因为它的可选参数,很多人也用它来去除UTF8BOM头、文件扩展名等等,比如ltrim($str,” \ xEF \ xBB \ xBF “);rtrim($str,”。txt “);。但是很快,你会发现这些函数会去掉一些更多的东西,比如本来想去掉后缀,结果logtext.txt就变成了logte而不是logtext。为什么?因为后一个参数的含义不是一个完整的字符串,而是一个字符列表,也就是说,它会一直检查最左边/最右边是否匹配这个列表中的一个。

5.默认情况下,htmlspecialchars函数不转义单引号。

很多网站把这个功能作为一般的输入过滤功能,但是这个功能默认不过滤单引号。这非常非常容易造成XSS的漏洞。这种做法和不过滤双引号没有太大区别,只要前端稍有不规则(使用单引号)就会中招。所以我们在使用这个函数的时候,必须添加参数htmlspecialchars ($ data,ent _ quotes)。

6.外语保留现象

在使用foreach($someArr as $someL){}等用法时,需要注意的是,最后一个$someL会一直保留到函数/方法的末尾。而在使用引用时,foreach ($有些arr作为& amp;$someL){}这个是引用保存的,意思是如果后面有一个同名的变量名,那么原来的数据就会被改变(就像一个误用的C指针)。为了安全起见,建议在每个foreach(特别是引用的)结束后,使用unset清除这些变量。

7.小数(符号点)不能直接比较是否相等。

例如,if( 0.5+0.2==0.7)得出false。原因是PHP是基于C语言的,由于其二进制符号点的表示,C语言无法准确表示大部分符号点。事实上,几乎所有的编程语言都无法准确表示小数点(符号点),这是一个普遍现象,因为这是IEEE 754的一个缺陷。要想解决这个问题,只能另立标准。似乎只有Mathematica解决了这个问题。

8.如果字符串相同,建议使用= =而不是= =。

为什么?因为这个比较弱。两者比较时,PHP会先尝试判断左右是否为数字。问题是什么样的字符串是一个数字,还是一个简单的数字字符串?远不止这些,还包括以0x开头的十六进制,XXeX类型的科学记数法等。例如,’ 12e0’==’0x0C ‘为真。当数字类型与字符串进行比较时,即使是一些以数字开头的非数字字符串,如字符串’ 12==’12 ‘,也会得到一个真值。

因此,在这些情况下,不相同的字符串可能会被判断为相等。使用= = =的比较是包含类型的比较,不会有转换,可以准确比较字符串是否相同。

另外吐槽一下JA,= =无法比较字符串是否相等,因为字符串是一个对象,= =就变成了判断是否是同一个对象…

9、开关中不能使用case in。

在PHP函数switch……case中,switch匹配case语句的值,case不能作为if使用。同时,switch表达式优先匹配与其值类型一致的case语句,不一致的类型稍后处理,如下所示:

10.strrchr函数是查找一个字符,而不是一个字符串。

在PHP手册中,对strrchr()函数的解释是在另一个字符串中找到一个字符串的最后位置,并返回从该位置到该字符串末尾的所有字符。如果失败,则返回false。其实这个函数是找一个字符,而不是一个字符串。比如很多人一开始肯定以为它会返回false,其实不是。

上面的例子表明,如果$b是一个字符串,那么只使用第一个字符,其他字符将被忽略。

本文由“编码之道”编辑,转载请注明出处。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论