飞机的 PHP 学习笔记三:字符串
前言
最近在系统的学习 PHP ,参考的资料是《PHP编程》+ 官方文档(如果你有好的学习资料,欢迎推荐给我)。虽然这本《PHP编程》是基于 PHP5 的,但我笔记里的代码,全部在 PHP 7.2 的环境里测试过,是能够运行的。另,本笔记中只记录我模糊不清的知识。
引用字符串常量
PHP 中可以使用三种方法来引入字符串的字面量:单引号、双引号和 UNIX Shell 衍生出来的 here 文档格式( heredoc
)。不同之处在于是否识别特殊的转义序列(对字符串进行编码和变量插值)和是否对变量进行解析
### 变量插值
在字符串中用变量的值来替换变量名。
直接使用:
$who = 'Kilroy';
$where = 'here';
echo "$who was $where"; // Kilroy was here
用大括号:
$n = 12;
echo "You are the {$n}th person"; // You are the 12th person
和一些 shell 环境不同,PHP 中的字符串不会重复解析,只处理在双引号字符串中的解析,然后把其结果作为字符串的值。
$bar = 'this is not printed';
$foo = '$bat';
print("$foo"); // $bar
单引号括起来的字符串
不能插值。除了 \'
和 \\
可以被转义,其他任何的反斜杠只被解析成一个反斜杠。
here文档
heredoc 由 <<<
和 标识符组成。并且其中的双引号和单引号被跳过,空白符被保留。
$dialogue = <<< NoMore
"It's not going to happen!" she fumed.
NoMore;
echo $dialogue; // 输出: "It's not going to happen!" she fumed.
输出字符串
echo
echo 不是一个函数(它是一个语言结构),因此你不一定要使用小括号来指明参数,单引号,双引号都可以。如果你想给 echo 传递多个参数, 那么就不能使用小括号。
另外,在 echo 中拼接字符串,要考虑 ,
和 .
运算符的优先级。 ,
的优先级非常的低,所以不需要圆括号保证优先级。 .
具有更高的优先级,为了正确性,必须使用圆括号。
echo "Sum: ", 1 + 2; // Sum: 3
echo "Hello ", isset($name) ? $name : "John Doe", "!"; // Hello John Doe!
echo 'Sum: ' . (1 + 2); // Sum: 3
echo 'Hello ' . (isset($name) ? $name : 'John Doe') . '!'; // Hello John Doe!
echo 和 print
最主要的不同之处是,echo 接受参数列表,并且没有返回值。
print
实际上不是函数(而是语言结构),所以可以不用圆括号包围参数列表。和 echo 最主要的区别: print
仅支持一个参数,并总是返回 1。
if (print("test")){ // test
print("It worked!"); // It worked!
}
printf()
通过替换模板(即格式化字符串)中的值所生成的字符。它源自标准的 C 库中的同名函数 printf()
printf(format[, $args[,...]]):int
// 使用
printf("$.2f", 27.452); // 27.45
sprintf()
和 printf()
的参数相同,但是它只返回生成的字符串而不是打印出来。
print_r 和 var_dump()
两者都是以易于理解的格式打印变量,相对来说 var_dump()
打印的变量更适合阅读,它会显示当前值的类型,显示共有多少个元素,且还会自动加上换行符。
整理字符串
### 删除空白符号
trim(string [, charlist]):string
: 返回删除了首尾空白符的字符串。ltrim(string [, charlist]):string
: 返回删除了首部空白的字符串。rtrim(string [, charlist]):string
: 返回删除了尾部空白的字符串。- 可选参数 charlist ,是可以指定要删除的字符列表。
不指定 charlist ,默认删除的字符为:
字符 | ASCII码 | 意义 |
---|---|---|
“ “ | 0x20,32 | 空格 |
“\t” | 0x09,9 | 制表符 |
“\n” | 0x0A,10 | 换行符 |
“\r” | 0x0D,13 | 回车符 |
“\0” | 0x00,0 | 空字节 |
“\x0B” | 0x0B,11 | 纵向制表符 |
改变大小写
strtolower(string):string
: 将字符串转换成小写。strtoupper(string):string
: 将字符串转换成大写。
## 编码和转义
HTML
HTML 中的特殊字符以实体字符标识,如 &(&)
和 <(<)
对所有特殊字符进行实体引用
htmlentities(string[, flags[, encoding[, double_encode]]]):string
将 HTML 字符转换成对应的实体字符。
string
为输入的字符,flags
为选择哪种模式的转换,encoding
为字符串的编码, double_encode
为是否转现有的 HTML 实体。
只对 HTML 语法字符进行引用
htmlspecialchars(string[, flags[, encoding[, double_encode]]]):string
参数与上面相同,只是对部分实体进行转换:&(&)
"(")
'(')
<(<)
>(≷)
删除 HTML 标签
strip_tags(string[, allowable_tags]):string
: 从字符串中删除 HTML 标签。
allowable_tags
来指定字符串中不被删除的标签。只用列出标签的开始形式。
提取元标签(meta tag)
get_meta_tags(filename|url[, use_include_path]):array
: 从一个文件中提取所有的 meta
标签的 content
属性,返回一个数组。
将 use_include_path
设置为 TRUE 将使 PHP 尝试按照 include_path
标准包含路径中的每个指向去打开文件。只用于本地文件,不适用与 URL 。
URL
应该只对部分 URL 进行编码:http://www.example.com/{这里进行编码}
RFC 3986 编码和解码
rawurlencode(string):string
: 编码函数,除了-
,_
,.
之外的所有非字母数字字符都会被替换成百分号( % )后跟两位进制数。rawurldecode(string):string
: 解码函数。
查询字符串编码
urlencode(string):string
:编码函数urldecode(string):string
:解码函数
与 PFC 3986 相比,唯一的区别在于将空格编码成加号( + ),而不是 %20 。这两个函数对生成查询字符串很有帮助
SQL
在 SQL 中对查询字符串进行转义,只需将单引号、双引号、空字符和反斜杠前面加上反斜杠即可
addslashes(string):string
: 将单引号、双引号、空字符和反斜杠前面加上反斜杠。stripslashes(string):string
: 将单引号、双引号、空字符和反斜杠前面去掉反斜杠。
### C语言字符串编码
addcslashes(string,charlist):string
: 以 C 语言风格使用反斜杠转义 string 中的字符,其中 charlist 指定要转义的字符范围(从小到大,如:A..Z
)。stripcslashes(string):string
: 返回去掉转义后的字符串。
比较字符串
精确比较
==
比较之前会进行转换,故:3 == '3'
,而 ===
不进行转换
对于 “PHP Rocks" < 5
,这将是 正确的。
因为 “PHP Rocks”
被转换成了 0
(因为字符串没有以数字开头)。所以比较要用到下面的函数。
strcmp(string,string):int
: 以字典序来比较strncasecmp(string,string):int
: 先转换成小写,在进行字典序比较strnatcasecmp(string,string):int
: 以自然排序比较
自然排序与字典序之间的区别
自然排序 | 字典序 |
---|---|
pic1.jpg | pic1.jpg |
pic5.jpg | pic10.jpg |
pic10.jpg | pic5.jpg |
pic50.jpg | pic50.jpg |
近似比较
soundex(string):string
: 生成一个字符串大致表示单词在英语中如何发音。metaphone(string[, phonemes]):string
: 生成一个字符串大致表示单词在英语中如何发音。比soundex()
更加精确。其中指定 phonemes 来限制生成的字符串长度,默认为 0 ,也就是没有限制。similar_text(string1, string2[, &percentage]):int
: 返回两个字符串参数共有的个数,第三个参数是通过引用的方式,来计算共有字符百分比。注意,此算法复杂度为O(n^3^),且使用递归。levenshtein(string1,string2[, cost_ins, cost_rep, cost_del]):int
: 返回两个字符串之间的编辑距离- 编辑距离:通过添加、替换和删除操作能将 string1 转换成 string2。如:
levenshtein("cat","cot")
返回 1 - 另外三个选项是指定插入、替换和删除操作的次数,来查看函数的结果。
- 编辑距离:通过添加、替换和删除操作能将 string1 转换成 string2。如:
处理和查找字符串
子串
substr(string, start[, length]):string
: 返回字符串string
由start
开始,长度为length
的子串。substr_count(haystack, needle[, offset[, length]]):int
: 返回子字符串needle
在字符串haystack
中出现的次数。其中offset
为偏移位置,length
为从偏移位置开始计算的长度。substr_replace(string, replacement, start[, length]):mixed
: 字符串string
的副本中将由start
和可选的 length 参数限定的子字符串使用replacement
进行替换。另:start
可以为负数。如下例子://设定 length 为 0 来实现无删除的插入: echo substr_replace("good bye citizen", "kind ", 9, 0); // good bye kind citizen //设定替换串为 “” 来实现无插入的删除: echo substr_replace("good bye kind citizen", "", 8; // good bye //如何在字符串开头插入内容: echo substr_replace("good bye", "now it's time to say", , 0); // now it's time to say good bye
其他字符串函数
strrev(string):string
: 返回string
反转后的字符串。str_repeat(input, multiplier):string
: 返回input
重复multiplier
此后的结果。
分解字符串
分解:explode(separator, string[, limit]):array
: 返回由字符串组成的数组,每个元素都是 string
的一个子串,他们被字符串 separator
作为边界点分割出来。
合并:implode(separator, array)
: 用 separator 将一维数组连接成一个字符串。若只有字符串参数,连接的字符串将没有分隔符,如:
$arr = array(1,2,3,4);
echo implode($arr); // 1234
sscanf(string,format[, &...]):mixed
: 按照模板来分解一个字符串。
字符串查找函数
strpos(haystack, needle[, offset = 0]):int
: 返回needle
在haystack
中首次出现的位置。注意:如果needle
出现在 haystack 的开头,函数返回0
。故我们在判断的是否存在与字符串中,一定要用===
符号来判断是否找到指定的字符串。strrpos()
: 和上述参数一样,只是返回最后一次出现的位置。strstr(haystack, needle[, before_needle = FALSE]):string
: 返回hatstack
字符串从needle
第一次出现的位置开始到haystack
结尾的字符串。若指定before_needle
为 TRUE ,则将返回haystack
位置之前的部分。stristr()
: 不区分大小写的strstr()
,且参数一致。strchr()
:strstr()
的别名函数。strtchr(haystack, needle):string
: 返回haystack
字符串中的一部分,以needle
最后出现的位置开始,知道haystack
末尾。注意:如果needle
包含了不止一个字符,那么仅使用第一个字符。needle
如果为数字的话,则转换成对应的ascii
码。strspn(subject, mask[, start[, length]]):int
返回subject
开头包含多少个特定的mask
字符。如下例://判断 $str 字符串是否为一个八进制数 function isOctal($str) { return strspn($str,'01234567') == strlen($str); }
strcspn(str1, str2[, start[, length]]):int
: 返回str1
中,所有字符都不存在与str2
范围的起始子字符串的长度。如:echo strcspn('hello','l'); // 2 hello 中 有两个 l ,它默认匹配最后的字符,也就是下标为 3 的 l ,所以这里返回 2
解析 URL
parse_url(url):array
: 返回一个由 URL 的各个成分组成的数组。
感谢你看到了这里。如果文章有错误,请评论指正,谢谢!
本作品采用《CC 协议》,转载必须注明作者和本文链接
改变大小写 两个写反了
strtolower(string):string : 将字符串转换成小写。
strtoupper(string):string : 将字符串转换成大写。