php字符串操作集锦
web操作, 主要就是对字符文本信息进行处理, 所以, 字符串操作几乎占了很大一部分的php操作.包括
注意strstr 和 strtr的区别?
前者表示字符串查找返回字符串,后者表示字符串中字符替换:
字符串替换
str_replace, 返回的是另外的结果, 原来的字符串不会被修改,相当于传递一个$haystack的副本
字符串截取:
中文截取模块的名字是 :php_mbstring.dll
在index.php中,现实的模块也是: mbstring.
只有在 代码中才是: mb_substr...(前面两个的mb和string都是挨着的...)
substr的第二个参数如果是负数,表示从最后面倒过来数
关键是要记住第三个参数就好了: 第三个参数很多时候默认缺省,表示截取到字符串结尾,
当第三个参数$length长度,为负数的时候: 表示从最后面倒过来 数长度, 实际上是 指 到倒数的位置时 截取就结束了。
但是,长度为负数的时候,结束位置处的字符是不算的,不会包含在截取字符串中的。
这个特别适用于 去掉字符串最后几个字符,如文件的扩展名的情况。如:
$filename = "abcd中文cccc.jpg";
echo $basename = substr($filename, 0, -4);
如果是中文的字符串截取, 就要使用 mb_substr, 最后一个参数指定字符集编码. 为什么呢? 因为默认的substr截取字符串的长度是 以 一个字节为 1个 "长度计量单位"的. 而utf8汉字是算三个字节长度的, gbk是算"2个字节长度的". 所以, 如果不是刚好截取到汉字的字节时, 就可能把 组成一个汉字的三个字节 硬生生的 截断, 取其中的一个/两个字节 来显示, 自然就产生乱码了.
这时, 使用mb_substr就会把1个汉字作为 一个 字符长度 来看待了,也就不会有乱码了.
支持中文字符串截取的模块的名字是 :php_mbstring.dll
在index.php中,现实的模块也是: mbstring.
只有在 代码中才是: mb_substr...
substr,的第二个参数如果是负数,表示从最后面倒过来数
// 只要记住第三个参数就好了: 第三个参数很多时候默认缺省,表示截取到字符串结尾,
// 当第三个参数$length长度,为负数的时候: 表示从最后面倒过来 数长度, 实际上是 指 到倒数的位置时 截取就结束了。
// 但是,长度为负数的时候,结束位置处的字符是不算的,不会包含在截取字符串中的。
// 这个特别适用于 去掉字符串最后几个字符,如文件的扩展名的情况。如:
$str = "abc中文字符串edf";
echo substr($str, 0,7); // 显示有乱码,或者后面的乱码没有显示, 或者乱码统一的用一个 方框 像“口”的 一半 来表示
echo mb_substr($str, 0, 7, 'utf8'); // 没有乱码,汉字作为一个字符长度 来表示。
要保证不会出现乱码, 需要注意两个地方:
第一, 要让页面的编码声明和编辑器保存文件的实际编码要一致, 如 dw和linux下的vim默认的都是用utf8来保存文件的, 而windows下的notepad等编辑器默认的保存文件是用gb2312,gbk等。 所以你最好在用dw或vim编辑保存文件时声明为 utf8.否则如果你声明为gb2312时,不管什么浏览器(ff或ie),都可能出现乱码。当然除非你手动设置浏览器的编码格式, 刚好跟你编辑器实际保存的编码相同时, 不会出现乱码。
第二, 在ie中, 为什么有时候不是所有的情况!!,在页面中已经声明了使用utf8编码, 但是ie仍然出现乱码。 而ff则不会。
这是由于两者在解析网页时的方式是不一样的:
对于ff, 它是首先去读取 http-request header的, 会首先 去读取到 meta或php 的header中指定的 编码字符集, 然后ff就会自动地 按照这个网页指定的 编码字符集去解析 文档。 所以ff你 页面指定的是什么字符集, 就会按照什么字符集去解析。
而对于ie则不同, 它并不会首先去 读取http header中页面指定的字符集。 而是首先 按照 **“默认” ** 的字符集(windows是gb2312)来解析文档, 或者如果你已经打开了ie并对编码做了改动, 则当前ie窗口会保持设定值来解析后面的 所有文档。 最后才会去读取 http header。(也就是说, ie是先解析标签, 然后才会去读取http header) 而这时文档已经被解析甚至已经被呈现出来了, 所以不会再返回去再修改。 只有等下一次手动修改ie编码了....
ie为什么有时候显示输出空白页?
对于用utf8编写的web文档, 用gb2312,或gbk解析时, 当title之间有 **奇数个汉字等全角字符时, 如果按照双子节的编码进行解析时, 就会形成 "半个汉字"的情况, 然后这个 "半个汉字"和后面的</title>
结合在一起,致使 ie以为找不到title的结束标签, 把后面的所有web内容都当作标题了, 从而就没有输出了.
单引号和双引号 对于标签和 转义的区别?
对于标签来说, 不管你是单引号, 还是双引号, 都是一样的, 单双引号对于标签来说是没有关系的。因为即使是按原样输出,标签还是一样能被浏览器解析, 如br, p等。
有区别的, 只是 转义字符, 对于单引号, 转义是无效的, 按原样输出, 而对于双引号, 才会转义,如\n, 使用时仍然要nl2br函数。
web文件的编码字符集,不管是mea还是header声明, 只是告诉浏览器,我的编码字符集是什么, 如utf8, 只是"声明", 实际具体是什么编码, 还要看真实的编辑器保存的编码格式
字符串变量的定义??
双引号中可以包含变量, 但是由于php的变量允许中文, 而且变量匹配是"贪婪匹配", 所以如果变量在字符串中间的时候, 要加上大括号{}来分隔定界. 当然如果在字符串的末尾, 变量不必加大括号.
字符串的定界符?
为什么要使用? 用途是: 在用字符串常常输入大段的html代码或js的时候, 里面包含很多的标签等, 你就要进行很多的单双引号, 特殊符号等转义, 这样是很痛苦的, 所以可以使用定界符就比较方便了. 而且, 定界符字符串会保留原来的格式,如回车/换行, 就相当于pre标签.
定界符以 关键字 "尖括号<<<" 开始, 然后是定界符标识, 最后一行是定界符标识加分号. 格式要严格区分, 不能有多余的空格和tab键等.
定界符的起始标识和结束标识, 就相对于编程中的大括号对{}一样.