飞机的 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!

echoprint 最主要的不同之处是,echo 接受参数列表,并且没有返回值。

print

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 中的特殊字符以实体字符标识,如 &amp;(&)&lt;(<)

所有特殊字符进行实体引用

htmlentities(string[, flags[, encoding[, double_encode]]]):string 将 HTML 字符转换成对应的实体字符。

string 为输入的字符,flags 为选择哪种模式的转换,encoding 为字符串的编码, double_encode 为是否转现有的 HTML 实体。

只对 HTML 语法字符进行引用

htmlspecialchars(string[, flags[, encoding[, double_encode]]]):string 参数与上面相同,只是对部分实体进行转换:&(&amp;) "(&quot;) '(&apos;) <(&lt;) >(&gl;)

删除 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
    • 另外三个选项是指定插入、替换和删除操作的次数,来查看函数的结果。

处理和查找字符串

子串

  • substr(string, start[, length]):string : 返回字符串 stringstart 开始,长度为 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 : 返回 needlehaystack 中首次出现的位置。注意:如果 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 协议》,转载必须注明作者和本文链接
讨论数量: 1

改变大小写 两个写反了
strtolower(string):string : 将字符串转换成小写。
strtoupper(string):string : 将字符串转换成大写。

4年前 评论
飞机飞过天空 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!