博客列表 >细说字符串及其函数

细说字符串及其函数

溪边小树
溪边小树原创
2020年04月29日 16:27:111606浏览

字符串函数

[toc]

1. 字符串语法

  • 字符串上限: 2G
  • 字符串中每个字符使用一个字节表示,仅支持 256 个,不支持Unicode

  • 有四种方式创建字符串

序号 方式 描述
1 单引号 全部内容视为纯文本
2 双引号 可解析变量和转义特殊字符
3 heredoc 与双引号类似
4 nowdoc 与单引号类似

1.1 单引号

单引号 转义符 特殊字符 变量
转义 转义 不转义 不解析

1.2 双引号

  • 双引号对内容的处理
双引号 转义符 特殊字符 变量
转义 转义 转义 解析
  • 双引号中的变量, 应该使用大括号{}限定标识符识别范围,如: “{\$email}”
  • 双引号中的特殊字符列表
序号 特殊字符 描述
1 \n 换行(ASCII 字符集中的 LF 或 0x0A (10))
2 \r 回车(ASCII 字符集中的 CR 或 0x0D(13))
3 \t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
4 \v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
5 \e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
6 \f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
7 \\ 反斜线
8 \$ 美元标记
9 \" 双引号
10 \[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
11 \x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符

1.3 heredoc

双引号 转义符 特殊字符 变量
不转义 不转义 转义 解析

1.4 nowedoc

单引号 转义符 特殊字符 变量
不转义 不转义 不转义 不解析

2. 打印输出函数

序号 函数 说明
1 echo 输出一个或多个字符串
2 print 输出字符串
3 printf 输出格式化字符串
4 vprintf 与 printf()区别在于参数在数组中
5 sprintf 返回格式化字符串,存入变量/文件中
6 vsprintf 与 sprintf()区别在于参数在数组中
7 fprintf 将格式化字符串写入文件流中
8 vfprintf 与 fprintf()区别在于参数使用数组
9 sscanf 根据指定格式解析输入的字符
10 number_format 以千位分隔符方式格式化一个数字

3 分割查询与替换函数

3.1 第一组

序号 函数 说明
1 implode 将一个一维数组的值转化为字符串
2 join 别名 implode
3 explode 使用一个字符串分割另一个字符串
5 substr 返回字符串的子串
6 substr_count 计算子串出现的次数
7 substr_replace 替换字符串的子串
8 str_split 将字符串转换为数组
9 str_getcsv 解析 CSV 字符串为一个数组

3.2 第二组

序号 函数 说明
10 str_pad 使用另一个字符串填充字符串为指定长度
11 str_repeat 重复一个字符串
12 str_replace 子字符串替换
13 str_ireplace str_replace 的忽略大小写版本
14 strtr 转换指定字符
15 str_shuffle 随机打乱一个字符串
16 wordwrap 打断字符串为指定数量的子串
17 trim 去除字符串首尾处的空白字符(或者其他字符)
18 rtrim 删除字符串末端的空白字符(或者其他字符)
19 ltrim 删除字符串开头的空白字符(或其他字符)
20 chop rtrim 的别名

附录 1: trim()/ltrim()/rtrim()去除的空白符列表

序号 空白符 描述
1 " " (ASCII 32 (0x20)),普通空格符
2 "\t" (ASCII 9 (0x09)),制表符
3 "\n" (ASCII 10 (0x0A)) 换行符
4 "\r" (ASCII 13 (0x0D))回车符
5 "\0" (ASCII 0 (0x00))空字节符
6 "\x0B" (ASCII 11 (0x0B))垂直制表符

3.3 第三组

序号 函数 说明
21 strpos 查找字符串首次出现的位置
22 stripos 查找字符串首次出现的位置(忽略大小写)
23 strripos 计算指定字符串在目标字符串中最后一次出现的位置(忽略大小写)
24 strrpos 计算指定字符串在目标字符串中最后一次出现的位置)
25 strstr 查找字符串的首次出现
26 stristr strstr 函数的忽略大小写版本
27 strrchr 查找指定字符在字符串中的最后一次出现
28 strchr 别名 strstr
29 strpbrk 在字符串中查找一组字符的任何一个字符
30 strspn 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度
31 strtolower 将字符串转化为小写
32 strtoupper 将字符串转化为大写
33 lcfirst 使一个字符串的第一个字符小写
34 ucfirst 将字符串的首字母转换为大写
35 ucwords 将字符串中每个单词的首字母转换为大写
36 strlen 获取字符串长度
37 strrev 反转字符串
38 strip_tags 从字符串中去除 HTML 和 PHP 标记

4. URL 处理函数

序号 函数 说明
1 parse_str 将字符串解析成多个变量,处理 url
2 parse_url 解析 URL,返回其组成部分
3 http_build_query 生成 URL-encode 之后的请求字符串
4 urldecode 解码已编码的 URL 字符串
5 urlencode 编码 URL 字符串
6 base64_encode MIME base64 数据解码
7 base64_decode MIME base64 数据编码

附录 1: $_SERVER预定义变量

以 URL 为例: http://php.io/case/demo12.php/m/admin/c/add?id=5&name=admin

序号 变量 描述 示例
1 UNIQUE_ID HTTP 请求的唯一标识符 Xn4DhH8AAAEAAAWiEO0AAAAB
2 HTTP_HOST HTTP 主机名/域名 php.io
3 SERVER_ADDR HTTP 主机名 IP 地址 127.0.0.1 / 0:0:0:1 / ::1
4 SERVER_PORT Web 服务器使用的端口 80
5 REMOTE_PORT 用户机器连接到 Web 服务器的端口号 52706
6 SERVER_NAME Appcha 配置的 ServerName php.io
7 DOCUMENT_ROOT 当前脚本所在的根目录(配置文件中) /Documents/web/php/case
8 SCRIPT_FILENAME 当前执行脚本的绝对路径 /Documents/web/php/case/demo1.php
9 SCRIPT_NAME 当前执行脚本的路径与文件名 /case/demo1.php
10 PHP_SELF 当前脚本名(含 pathinfo) /case/demo1.php/m/admin/c/add
11 PATH_INFO 执行脚本与查询字符串之间的路径信息 /m/admin/c/add
12 PATH_TRANSLATED 脚本所在文件系统路径(限 pathinfo) /Documents/web/php/m/admin/c/add
13 REQUEST_URI 当前访问的 URL(pathinfo,查询字符串) case/demo1.php/m/admin/c/add?id=5&…
14 QUERY_STRING 查询字符串(不含前导问号?) id=5&name=admin
15 REQUEST_METHOD HTTP 请求类型 POST / GET
16 HTTP_REFERER 引导用户进入当前页面的 URL 如果是直接进入当前页,则不存在该值
17 HTTP_USER_AGENT 客户端/浏览器信息get_browser() Mozilla/5.0 (Macintosh; Intel Mac …
18 SERVER_SOFTWARE web 服务器软件 Apache
19 SERVER_PROTOCOL web 服务器 HTTP 协议 HTTP/1.1
20 GATEWAY_INTERFACE 网关接口:服务器使用 CGI 规范 CGI/1.1
21 REQUEST_TIME HTTP 请求开始的时间戳 1585320730
22 REQUEST_TIME_FLOAT HTTP 请求开始的时间戳(微秒级) 1585320730.803
23 argv 传递给脚本的参数数组 Array ( [0] => id=5&name=admin )
24 argc 传递给脚本的参数数量 1
25 HTTP_ACCEPT 客户端请求/接受文档类型 text/html,application/xhtml+xml,appli…
26 HTTP_ACCEPT_ENCODING HTTP 压缩 HTML 的编码方式 gzip, deflate
27 HTTP_ACCEPT_LANGUAGE HTTP 接受的语言 zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7

附录 2: urlencode():对 url 变量值进行编码

除了-\_.之外的所有字符 空格 编码方式
%+2 位 16 进制数 + application/x-www-form-urlencoded

附录 3: base64_encode():用 base64 对 data 进行编码

  • 为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体
  • 下载链接, 图片等都可以使用它进行加密处理
  • 加密之后的数据比原始数据要多占据 33%的空间大小

附录 4: Data URI Scheme(协议)

形如:data:text/jpeg;base64,/9j/4AAQSkZJRgABA... 这样的资源链接

序号 协议 说明
1 data: 文本数据
2 data:text/plain, 文本数据
3 data:text/html, HTML 代码
4 data:text/css;base64, css 代码
5 data:text/javascript;base64, javascript 代码
6 data:image/x-icon;base64, base64 编码的 icon 图片数据
7 data:image/gif;base64, base64 编码的 gif 图片数据
8 data:image/png;base64, base64 编码的 png 图片数据
9 data:image/jpeg;base64, base64 编码的 jpeg 图片数据

5. HTML 相关

序号 函数 说明
1 htmlspecialchars 将特殊字符转换为 HTML 实体
2 htmlspecialchars_decode 将特殊的 HTML 实体转换回普通字符
3 htmlentities 将字符转换为 HTML 转义字符
4 html_entity_decode 将 HTML 实体转换为它们相应的字符
5 nl2br 在字符串所有新行之前插入 HTML 换行标记

附录 1: html 实体字符

  • 某些字符在 html 文档中有特殊意义,如<>用表示元素标签,这些都是预留字符,不能直接使用
  • 如果要在 html 文档中正确显示他们,需要将它们转为html 实体字符,如<转为<
  • html 实体字符有二种表示方法: 1. 命名表示法,如<, 2. 编码表示法, 如&60;
  • 常用实体字符列表:
序号 描述 实体名称 实体编码
1 ' ' 空格
2 < 小于号 < <
3 > 大于号 > >
4 & 和号 & &
5 " 双引号 " "
6 ' 单引号 ' '
7 分(cent) ¢ ¢
8 £ 镑(pound) £ £
9 ¥ 元(yen) ¥ ¥
10 欧元(euro)
11 § 小节 § §
12 © 版权(copyright) © ©
13 ® 注册商标 ® ®
14 商标
15 × 乘号 × ×
16 ÷ 除号 ÷ ÷

附录 2: htmlspecialchars()转换字符列表

序号 原字符 替换成
1 & &
2 " "
3 ' '
4 < <
5 > >

如果要转换的字符超出以上列表,请使用: htmlentities()

附录 3: 转换时的 FLAG 常量

序号 常量 描述
1 ENT_COMPAT 会转换双引号,不转换单引号
2 ENT_QUOTES 既转换双引号也转换单引号
3 ENT_NOQUOTES 单/双引号都不转换
4 ENT_SUBSTITUTE 替换无效的代码单元序列为 Unicode 代替符
5 ENT_DISALLOWED 为文档的无效代码点替换为 Unicode 代替符
6 ENT_HTML401 以 HTML 4.01 处理代码
7 ENT_XML1 以 XML 1 处理代码
8 ENT_XHTML 以 XHTML 处理代码
9 ENT_HTML5 以 HTML 5 处理代码

6. 转码相关函数

序号 函数 说明
1 chr 返回指定的字符
2 ord 转换字符串第一个字节为 0-255 之间的值
3 chunk_split 将字符串分割成小块
4 bin2hex 函数把包含数据的二进制字符串转换为十六进制值
5 hex2bin 转换十六进制字符串为二进制字符串
7 convert_uuencode 将所有(含 2 进制)字符串转为可打印字符便于网络安全传输
6 convert_uudecode 将 convert_uuencode 编码的字符串解析还原(反操作)
8 count_chars 返回字符串所用字符的信息(每个字符出现的次数)
9 quotemeta 转义元字符集: . \ + * ? [ ^ ] ( $ )
  • count_chars() 的模式符:
序号 模式符 说明
1 0 以所有的每个字节值作为键名, 出现次数作为值的数组
2 1 与 0 相同,但只列出出现次数大于零的字节值
3 2 与 0 相同,但只列出出现次数等于零的字节值
4 3 返回由所有使用了的字节值组成的字符串
5 4 返回由所有未使用的字节值组成的字符串
  • quotemeta(): 预定义的字符前添加反斜线\
  • 预定义字符列表(在正则中具有特殊语义)
序号 字符 说明
1 . 圆点
2 \ 反斜线
3 + 加号
4 * 星号
5 ? 问号
6 [] 方括号
7 ^ 脱字符
8 $ 美元符
9 () 圆括号

7. 哈希相关函数

序号 函数 说明
1 md5_file 计算指定文件的 MD5 散列值
2 md5 计算字符串的 MD5 散列值
3 sha1_file 计算文件的 sha1 散列值
4 sha1 计算字符串的 sha1 散列值
5 crypt 单向字符串散列
6 crc32 计算一个字符串的 crc32 多项式
7 str_rot13 对字符串执行 ROT13 转换

8. 统计与比较函数

序号 函数 说明
1 strspn 返回字符串与掩码中字符串匹配的字符数量
2 strcspn 返回第一个字符串中, 找到与掩码字符之前的字符数量
3 str_word_count 返回字符串中单词的使用情况
4 substr_compare 二进制安全比较字符串(从偏移位置比较指定长度)
5 strcmp 二进制安全字符串比较
6 strncmp 二进制安全比较字符串开头的若干个字符
7 strcasecmp 二进制安全比较字符串(不区分大小写)
8 strncasecmp 二进制安全比较字符串开头的若干个字符(不区分大小写)

示例

示例1:字符串表示方式

  1. <?php
  2. // 字符串
  3. // 1. 单引号
  4. // 2. 双引号
  5. // 3. heredoc: 类似双引号
  6. // 4. nowdoc: 类似单引号
  7. /********************************************************** */
  8. // 1. 单引号
  9. // 不解析内部变量
  10. // 单引号目前是字符串的定界符
  11. // 转义字符"\"在单引号中只能转义自身和单引号自己
  12. // 转放字符不能转义特殊字符: \r\t\
  13. $str='小树小站';
  14. echo 'This a good site:$str';
  15. echo '<hr>';
  16. // $str: 变量标识符
  17. // 2. 双引号
  18. // 双引号字符串的变量会被解析出来值
  19. // echo "This is a $string";
  20. // 给双引号中的变量添加 "变量定界符"
  21. echo "This is a {$str}ing", '<br>';
  22. echo "This is a ${str}ing";
  23. echo '<hr>';
  24. // 如果说双引号字符串出现了: 1. 双引号, 2. 特殊字符, 3. 转义字符\
  25. echo "This \"s \r\n a ${str} \\";
  26. echo '<hr>';
  27. // 3. heredoc
  28. // 内部的字符串不需要添加定界符
  29. // 功能与双引号定义的字符串类似
  30. echo <<< "ok"
  31. This is a $str
  32. ok;
  33. // heredoc适合输出大量的html+php的代码
  34. $book = ['id'=>123, 'name'=>'PHP开发指南', 'price'=> 99];
  35. // "BOOK"的双引号可以省略
  36. echo <<< BOOK
  37. <ul style="list-style:none">
  38. <li>ID: {$book['id']}</li>
  39. <li>书名: {$book['name']}</li>
  40. <li>价格: {$book['price']}</li>
  41. </ul>
  42. BOOK;
  43. echo '<hr>';
  44. // 4. nowdoc
  45. // 内部的字符串不需要添加定界符
  46. // 功能与"单引号"定义的字符串类似
  47. echo <<< 'ABC'
  48. This 's a \r\n $str \
  49. ABC;
  50. echo '<hr>';
  51. // nowdoc适合大段php代码,而且不需要转义,也不需要解析内部变量的文本
  52. // 经常用于初始化类属性和类常量, 凡是需要静态数据的场景下都可以用
  53. class Demo
  54. {
  55. const STR = <<< 'FOO'
  56. mail: admin@php.cn <br>
  57. qq: 498668472 <br>
  58. work-unit: php中文网 <br>
  59. FOO;
  60. }
  61. echo Demo::STR;

示例2:打印输出函数

  1. <?php
  2. // 打印输出函数
  3. // printf(): 格式化输出
  4. // printf('输出的格式', 字符串列表)
  5. $site = 'php.cn';
  6. // %s: 字符串, %d: 数值
  7. printf('Hello %s', $site);
  8. echo '<br>';
  9. printf('SELECT * FROM `%s` LIMIT %d', 'staff', 25);
  10. echo '<hr>';
  11. // vprintf(): 与printf()区别就在参数上,多个参数使用数组
  12. vprintf('SELECT * FROM `%s` LIMIT %d', ['staff', 5]);
  13. echo '<hr>';
  14. // sprintf():与printf()功能一样, 但是它是返回, 不是打印
  15. echo sprintf('SELECT * FROM `%s` LIMIT %d', 'users', 15);
  16. echo '<br>';
  17. // vsprintf 与 vprint: 返回字符串版本
  18. echo vsprintf('SELECT * FROM `%s` LIMIT %d', ['staff', 25]);
  19. echo '<hr>';
  20. // fprintf():将格式化的字符串写入到一个文件流中
  21. $writerin = fopen('1.txt','w') or die('You can not open it');
  22. fprintf($writerin,sprintf('SELECT * FROM `%s` LIMIT %d', 'staff', 55));
  23. echo file_get_contents('1.txt');
  24. echo '<hr>';
  25. $handle = fopen('test.txt', 'w') or die('open file faill');
  26. fprintf($handle,sprintf('SELECT * FROM `%s` LIMIT %d', 'staff', 555555));
  27. echo file_get_contents('test.txt');
  28. echo '<hr>';
  29. // sscanf(): 按指定的格式输入数据
  30. var_dump(sscanf('SN-5566', 'SN-%d'));
  31. list($sn) = sscanf('SN-123333', 'SN-%d');
  32. echo $sn;
  33. echo '<hr>';
  34. // number_format(): 数值格式化
  35. echo number_format(12345.67), '<br>';
  36. echo number_format(12345.67, 2), '<br>';
  37. echo number_format(12345.67, 2, '.', ''), '<br>';
  38. echo number_format(12345.67, 2, '.', '-'), '<br>';

示例3

  1. <?php
  2. //分割查询与替换: 第一部分
  3. // implode(): 一维数组转字符串
  4. // 用指定字符串将数组组装成一个字符串返回
  5. echo implode('***', ['html', 'css', 'js', 'php']), '<br>';
  6. // echo join('***', ['html', 'css', 'js', 'php']), '<br>';
  7. echo '<br>';
  8. // explode(): 使用一个字符串来分隔另一个字符串, 返回数组
  9. $aaa ='123-abc-456-dfg-789';
  10. printf('<pre>%s</pre>',print_r(explode('-',$aaa,4),true));
  11. list($num,$char)=explode('-',$aaa,4);
  12. echo "$num=>$char";
  13. echo '<hr>';
  14. $paras = 'localhost-root-root-utf8-3306';
  15. printf('<pre>%s</pre>', print_r(explode('-', $paras, 4), true));
  16. list($host,$user, $pass) = explode('-', $paras, 4);
  17. echo "$host: $user => $pass";
  18. echo '<hr>';

示例4

  1. <?php
  2. // 分割查询与替换函数: 第一部分
  3. //substr($string, $start, $length): 返回字符串的子串
  4. echo substr('11111ababab',0),'<br>';
  5. echo substr('11111ababab',2),'<br>';
  6. echo substr('11111ababab',2,2),'<br>';
  7. echo substr('abcdef', 0), '<br>';
  8. echo substr('abcdef', 2), '<br>';
  9. echo substr('abcdef', 2, 2), '<br>';
  10. // 参数支持负数
  11. // echo substr('abcdef', -1, 1), '<br>';
  12. // echo substr('abcdef', -1), '<br>';
  13. // echo substr('abcdef', -3), '<br>';
  14. // echo substr('abcdef', -3, 2), '<br>';
  15. // echo '<hr>';

示例5

  1. <?php
  2. // substr_count($str, $needel, $start, $length): 统计某个子串的出现的频率/次数
  3. // 统计 'is' 的出现的频率
  4. echo substr_count('This is a test', 'is'), '<br>';
  5. echo substr_count('This is a test', 'is', 3), '<br>';
  6. echo substr_count('This is a test', 'is', 3, 3), '<br>';
  7. echo '<hr>';

示例6

  1. <?php
  2. $search = ['交友', '广告', '直播', '带货'];
  3. $replace =['***', '===', '###', '+++'];
  4. $comment = '广告代理, 直播教学, 免费带货, 异性交友';
  5. echo str_replace($search, '###', $comment), '<br>';
  6. echo str_replace($search,$replace, $comment), '<br>';
  7. echo '<hr>';

示例7

  1. <?php
  2. //strcmp — 二进制安全字符串比较,strcmp ( string $str1 , string $str2 ) : int,注意该比较区分大小写。
  3. //参数,str1,第一个字符串;str2,第二个字符串。
  4. //返回值,如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
  5. $var1 = "Xibianxiaoshu";
  6. $var2 = "xibianxiaoshu";
  7. if (strcmp($var1, $var2) !== 0) {
  8. echo "$var1".' is not equal to '."$var2".' in a case sensitive string comparison'.'<br>';
  9. }

示例8

  1. <?php
  2. //strpos — 查找字符串首次出现的位置
  3. //说明,strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int
  4. //返回 needle 在 haystack 中首次出现的数字位置。
  5. //参数,haystack在该字符串中进行查找。 needle,如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。
  6. //offset 如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。 如果是负数,搜索会从字符串结尾指定字符数开始。
  7. $str = 'abcdabcccdddabab';
  8. $needle ='cd';
  9. echo '所查询的子串首次出现的位置为:'.strpos($str,$needle,3),'<hr>';

示例9

  1. <?php
  2. //strtoupper — 将字符串转化为大写
  3. //说明,strtoupper ( string $string ) : string,将 string 中所有的字母字符转换为大写并返回。
  4. //注意 "字母" 与当前所在区域有关。例如,在默认的 "C" 区域,字符 umlaut-a(?)就不会被转换。
  5. //参数,string,输入字符串。 返回值,返回转换后的大写字符串。
  6. $str = "Mary Had A Little Lamb and She LOVED It So";
  7. $str = strtoupper($str);
  8. echo $str; // 打印 MARY HAD A LITTLE LAMB AND SHE LOVED IT SO
  9. //strtolower — 将字符串转化为小写

示例10

  1. <?php
  2. //md5 — 计算字符串的 MD5 散列值
  3. //说明,md5 ( string $str [, bool $raw_output = FALSE ] ) : string
  4. //使用 » RSA 数据安全公司的 MD5 报文算法计算 str 的 MD5 散列值。
  5. //参数,str,原始字符串。 raw_output,如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。
  6. //返回值,以 32 字符十六进制数字形式返回散列值。
  7. $str = 'apple';
  8. if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
  9. echo "Would you like a green or red apple?";
  10. }

课程学习小结

本次课程详细介绍了字符串及其相应函数的相关知识,老师用归纳和实例的方式讲解了对应内容,尽量让抽象的知识能通俗易懂,学习函数相关知识的时候,重点还在于对函数参数的理解以及在实际场景中的灵活运用,开始大家都觉得听不太懂或者数量众多记不牢,在老师的指引下,我们通过回看视频及上机实践,尤其是从官网等途径查阅相关网络学习资料,在相对理解的基础上,做一定的案例代码模仿练习,进一步巩固了相关知识,对后续的学习有不小的帮助。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议