前言
最近在系统的学习 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 接受参数列表,并且没有返回值。
echo 是用来打印字符串的,所以用 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),且使用递归。levenshtein(string1,string2[, cost_ins, cost_rep, cost_del]):int
: 返回两个字符串之间的编辑距离- 编辑距离:通过添加、替换和删除操作能将 string1 转换成 string2。如:
levenshtein("cat","cot")
返回 1 - 另外三个选项是指定插入、替换和删除操作的次数,来查看函数的结果。
处理和查找字符串
子串
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 的各个成分组成的数组。
感谢你看到了这里。如果文章有错误,请评论指正,谢谢!