博客列表 >PHP - 字符串函数

PHP - 字符串函数

晴天
晴天原创
2020年04月23日 15:23:031076浏览

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 字符串为一个数组 |

  1. <?php
  2. // implode将一个一维数组的值转化为字符串
  3. $arr = ['ss','ss','dd'];
  4. echo '<br>'.'转换前';
  5. print_r($arr);
  6. // 输出Array ( [0] => ss [1] => ss [2] => dd )
  7. echo '<br>'.'转换后';
  8. echo implode($arr);
  9. // 输出 ssssdd
  10. // explode 使用一个字符串分割另一个字符串
  11. $str = '民主,富强,和谐,文明,自主';
  12. echo $str ; //输出 民主,富强,和谐,文明,自主
  13. // 分割
  14. //第一个参数为分割标志符 上面用逗号分割 这个输入逗号
  15. // explode('',$str);
  16. // 输出
  17. print_r(explode(',',$str));
  18. // 注意 不要用中文符号,要用英文,否则分割失败
  19. // 输出 Array ( [0] => 民主 [1] => 富强 [2] => 和谐 [3] => 文明 [4] => 自主 )

备注演示代码

  1. <?php
  2. // 分割查询与替换函数: 第一部分
  3. // substr($string, $start, $length): 返回字符串的子串
  4. // echo substr('abcdef', 0), '<br>';
  5. // echo substr('abcdef', 2), '<br>';
  6. // echo substr('abcdef', 2, 2), '<br>';
  7. // 参数支持负数
  8. // echo substr('abcdef', -1, 1), '<br>';
  9. // echo substr('abcdef', -1), '<br>';
  10. // echo substr('abcdef', -3), '<br>';
  11. // echo substr('abcdef', -3, 2), '<br>';
  12. // echo '<hr>';
  13. // substr_count($str, $needel, $start, $length): 统考某个子串的出现的频率/次数
  14. // 统计 'is' 的出现的频率
  15. // echo substr_count('This is a test', 'is'), '<br>';
  16. // echo substr_count('This is a test', 'is', 3), '<br>';
  17. // echo substr_count('This is a test', 'is', 3, 3), '<br>';
  18. echo '<hr>';
  19. // substr_replace($str, $replace, $start, $length): 替换字符串中的子串
  20. // echo substr_replace('html, css,js,java', 'php', 0), '<br>';
  21. // echo substr_replace('html, css,js,java', 'php, ', 0, 0), '<br>';
  22. // echo substr_replace('html, css,js,java', 'php, ', -4), '<br>';
  23. // echo substr_replace('html, css,js,java', '', 6, 4), '<br>';
  24. // $res = substr_replace(['id:101', 'id:203', 'id:908'], '0', 3, 3);
  25. // // print_r($res);
  26. // echo implode('; ', $res), '<br>';
  27. // $res = substr_replace(['id:101', 'id:203', 'id:908'], ['a', 'b', 'c'], 3);
  28. // echo implode('; ', $res), '<br>';
  29. // $res = substr_replace(['id:101', 'id:203', 'id:908'], ['a', 'b', 'c'], 3, [1,2,3]);
  30. // echo implode('; ', $res),'<br>';
  31. // echo '<hr>';
  32. // str_split(): 将字符串转为数组, 可以指定每个数组元素的宽度
  33. // $res = print_r(str_split('php.cn'), true);
  34. // $res = print_r(str_split('php.cn', 3), true);
  35. // printf('<pre>%s</pre>', $res);
  36. // echo '<hr>';
  37. // str_getcsv($str):操作csv文件
  38. // str_getcsv('csv格式的字符串')
  39. $res =print_r(str_getcsv('2, peter, peter@php.cn'),true);
  40. printf('<pre>%s</pre>', $res);
  41. $csvStr = file_get_contents('test2.csv');
  42. print_r($csvStr);
  43. $csvArr = explode("\n", $csvStr);
  44. $res =print_r($csvArr, true);
  45. printf('<pre>%s</pre>', $res);
  46. // str_pad(): 将字符串填充到指定长度
  47. echo str_pad('php', 10, '=', STR_PAD_RIGHT), '<br>';
  48. echo str_pad('php', 10, '=', STR_PAD_LEFT), '<br>';
  49. echo str_pad('ph', 10, '=', STR_PAD_BOTH), '<br>';
  50. echo '<hr>';
  51. // echo str_repeat('-*-|', 10);
  52. // str_replace($search, $replaced, $subject, $int): 字符串替换
  53. $class = 'app\home\Index.php';
  54. // 将类名的命名空间分隔符\, 替换成路径分隔符
  55. echo str_replace('\\', DIRECTORY_SEPARATOR, $class), '<br>';
  56. echo str_replace('php', '*', 'php.cn, php, thinkphp', $count), '<br>';
  57. echo 'php 被替换了 : ' .$count . '<br>';
  58. // 也支持数组参数实现批量替换
  59. $search = ['交友', '广告', '直播', '带货'];
  60. $replace =['***', '===', '###', '+++'];
  61. $comment = '广告代理, 直播教学, 免费带货, 异性交友';
  62. echo str_replace($search, '###', $comment), '<br>';
  63. echo str_replace($search,$replace, $comment), '<br>';
  64. echo '<hr>';

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. <?php
  2. // strtr 转换指定字符
  3. $str = 'aaabbbccc';
  4. // 将里面的ac替换成de
  5. echo strtr($str,'ac','de');
  6. // 输出 dddbbbeee
  7. // str_shuffle 随机打乱一个字符串
  8. $str = 'aaabbbccc';
  9. // 打乱输出
  10. echo str_shuffle($str);
  11. // 输出 cababcbca
  12. echo '<hr>';
  13. // wordwrap 打断字符串为指定数量的字串
  14. $str = 'An example of a long word is: Supercalifragulistic';
  15. // 打断指定数量然后添加文字
  16. echo wordwrap($str,10,'的');
  17. // 输出 An example的of a long的word is:的Supercalifragulistic

附录 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. <?php
  2. $str = ' This is a string ';
  3. // echo strlen($str), '<br>';
  4. // echo strlen(trim($str)), '<br>';
  5. // echo strlen(ltrim($str)), '<br>';
  6. // echo strlen(rtrim($str)), '<br>';
  7. $str = '123456890php.cn php中文网 this is good site654321';
  8. // echo trim($str, '12'), '<br>';
  9. // echo trim($str, '1..6'), '<br>';
  10. // echo trim($str, '0..9'), '<br>';
  11. // chop()
  12. echo '<hr>';
  13. // md5():返回32位随机字符串,由16进制的字符组成, 0-9, a-f
  14. echo md5('admin888'), '<br>';
  15. // 40位
  16. // echo sha1(md5(sha1('admin888'. 'php.cn....345**==='))), '<br>';
  17. // echo '<hr>';
  18. echo strip_tags('<h2>php.cn</h2><?php echo "Hello" ?>');
  19. // echo '<hr>';
  20. // parse_str(): 解析查询字符串
  21. // http://php.edu/0422/case/demo2.php?id=5&name=admin&role=1
  22. // ?id=5&name=admin&role=1: 查询字符串
  23. // echo $queryString = $_SERVER['QUERY_STRING'];
  24. parse_str( $queryString, $arr);
  25. // printf('<pre>%s</pre>', print_r($arr, true));
  26. // echo '<hr>';
  27. // parse_url(): 解析url
  28. $url = 'http://php.edu/0422/case/demo2.php';
  29. $urlArr = parse_url( $url);
  30. printf('<pre>%s</pre>', print_r($urlArr, true));
  31. $data = ['name'=>'peter zhu', 'age'=>30];
  32. echo http_build_query($data). '<hr>';
  33. // name=peter+zhu&age=30
  34. // 参数支持对象
  35. // echo http_build_query((new class {
  36. // public $name = 'admin';
  37. // public $email = 'admin@php.cn';
  38. // public $age = 99;
  39. // })). '<br>';
  40. echo '<hr>';
  41. $img = base64_encode(file_get_contents('1.jpg'));
  42. echo '<hr>';
  43. echo "<img src='data:image/>jpeg;base64,{$img}'>" . '<br>';
  44. // 因为编码之后, 编码可以随html同步发送到浏览器,减少了http请求
  45. file_put_contents('gril.jpg',base64_decode($img));
  46. echo "<img src='gril.jpg'>" . '<br>';

附录 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 实体字符,如<转为&lt;

  • html 实体字符有二种表示方法: 1. 命名表示法,如&lt;, 2. 编码表示法, 如&60;

  • 常用实体字符列表:

| 序号 | 描述 | 实体名称 | 实体编码 |

| —— | ——- | ————————- | ————— |

| 1 | ' ' | 空格 | &nbsp; | &#160; |

| 2 | < | 小于号 | &lt; | &#60; |

| 3 | > | 大于号 | &gt; | &#62; |

| 4 | & | 和号 | &amp; | &#38; |

| 5 | " | 双引号 | &quot; | &#34; |

| 6 | ' | 单引号 | &apos; | &#39; |

| 7 | | 分(cent) | &cent; | &#162; |

| 8 | £ | 镑(pound) | &pound; | &#163; |

| 9 | ¥ | 元(yen) | &yen; | &#165; |

| 10 | | 欧元(euro) | &euro; | &#8364; |

| 11 | § | 小节 | &sect; | &#167; |

| 12 | © | 版权(copyright) | &copy; | &#169; |

| 13 | ® | 注册商标 | &reg; | &#174; |

| 14 | | 商标 | &trade; | &#8482; |

| 15 | × | 乘号 | &times; | &#215; |

| 16 | ÷ | 除号 | &divide; | &#247; |

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

| 序号 | 原字符 | 替换成 |

| —— | ——— | ———— |

| 1 | & | &amp; |

| 2 | " | &quot; |

| 3 | ' | &#039; |

| 4 | < | &lt; |

| 5 | > | &gt; |

如果要转换的字符超出以上列表,请使用: 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 | 二进制安全比较字符串开头的若干个字符(不区分大小写) |

总结 写了两个小工具 天气查询跟缩短网址

演示地址:

天气查询 http://php.rc238.cn/0422

手机端预览效果比较好。没做最大宽度限制,里面有个地方可以用循环来做的,等做完才反应过来。。。

缩短网址 http://php.rc238.cn/short.php

原理是随机生成一串字母 用这串字母作为新创建的文件夹名

fprintf 将代码 写入该文件夹下面的 index.html,

不过有个致命的缺陷就是 网址内不能含有‘%’符,否则无法写入 如果替换掉 html 里的 js 就无法正常工作,不替换不能写入 纠结

  • 天气源代码
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>全国天气查询系统</title>
  7. <link rel="stylesheet" href="css/index.css" />
  8. </head>
  9. <body>
  10. <!-- 背景图 -->
  11. <div class="bg">
  12. <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1587538789556&di=adfe280b4877300120b0b1e3a99232a6&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201409%2F07%2F20140907225206_aQmeH.thumb.700_0.jpeg"
  13. alt="" />
  14. </div>
  15. <header>
  16. <p>全国城市天气查询系统</p>
  17. <div>
  18. <form action="" method="GET">
  19. <input type="text" name="city" placeholder="请输入城市名" required />
  20. <button>查询</button>
  21. </form>
  22. </div>
  23. </header>
  24. <main>
  25. <fieldset>
  26. <legend>查询结果</legend>
  27. <?php
  28. error_reporting(0);
  29. function city(){
  30. if (!isset($_GET['city'])&&$_GET['city'] == null) {
  31. // 获取IP地址
  32. $ip = $_SERVER["REMOTE_ADDR"];
  33. //转为城市
  34. $tip = json_decode(file_get_contents("http://api.map.baidu.com/location/ip?ak=2TGbi6zzFm5rjYKqPPomh9GBwcgLW5sS&ip={$ip}",true),true);
  35. $ipcity = $tip['content']['address_detail']['city'];
  36. $tcity = $ipcity;
  37. }else {
  38. @$tcity = $_GET['city'];
  39. }
  40. return $tcity;
  41. }
  42. $scity = city();
  43. $appkey = '京东appkey';
  44. $url = 'https://way.jd.com/jisuapi/weather?city='.$scity.'&appkey='.$appkey;
  45. $weather = json_decode(file_get_contents($url,true),true);
  46. // 天气总数据
  47. $tweather = $weather['result']['result'];
  48. // 空气质量
  49. $aqi = $weather['result']['result']['aqi'];
  50. // 日期
  51. $daily = $weather['result']['result']['daily'];
  52. // 第一天
  53. $daily1 = $daily['0'];
  54. // 二
  55. $daily2 = $daily['1'];
  56. // 三
  57. $daily3 = $daily['2'];
  58. // 四
  59. $daily4 = $daily['3'];
  60. // 五
  61. $daily5 = $daily['4'];
  62. // 六
  63. $daily6 = $daily['5'];
  64. // 七
  65. $daily7 = $daily['6'];
  66. // 返回信息
  67. $error = $weather['result']['msg'];
  68. // 24小时天气
  69. $h24 = $weather['result']['result']['hourly'];
  70. // 指数
  71. $index = $weather['result']['result']['index'];
  72. if ($scity=== null) {
  73. echo '请输入城市名;';
  74. }elseif ($error === 'ok') {
  75. echo
  76. // <p>{$tweather['week']}</p>;
  77. //{$weather['result']['result']['week']};
  78. <<< AAA
  79. <!-- 城市更新时间 -->
  80. <section class="head">
  81. <div>{$tweather['city']}</div>
  82. <div>更新时间:{$tweather['updatetime']}</div>
  83. </section>
  84. <!-- 温度 天气 空气 -->
  85. <section class="wendu">
  86. <div>
  87. <span>{$tweather['temp']}°</span>
  88. <span>{$tweather['weather']}</span>
  89. </div>
  90. <div>
  91. <!-- 最高最低气温 -->
  92. <span>{$tweather['templow']}~{$tweather['temphigh']}°C</span> |
  93. <!-- 风向、风力 -->
  94. <span>{$tweather['winddirect']}/{$tweather['windpower']}</span>
  95. </div>
  96. <div><span>湿度:{$tweather['humidity']}</span> | <span>空气{$aqi['quality']}</span></div>
  97. </section>
  98. <section class = "h24">
  99. <div>24小时天气</div>
  100. <div>
  101. <div>
  102. <p>现在</p>
  103. <p>{$h24['0']['weather']}</p>
  104. <p>{$h24['0']['temp']}°C</p>
  105. </div>
  106. <div>
  107. <p>{$h24['1']['time']}</p>
  108. <p>{$h24['1']['weather']}</p>
  109. <p>{$h24['1']['temp']}°C</p>
  110. </div>
  111. <div>
  112. <p>{$h24['2']['time']}</p>
  113. <p>{$h24['2']['weather']}</p>
  114. <p>{$h24['2']['temp']}°C</p>
  115. </div>
  116. <div>
  117. <p>{$h24['3']['time']}</p>
  118. <p>{$h24['3']['weather']}</p>
  119. <p>{$h24['3']['temp']}°C</p>
  120. </div>
  121. <div>
  122. <p>{$h24['4']['time']}</p>
  123. <p>{$h24['4']['weather']}</p>
  124. <p>{$h24['4']['temp']}°C</p>
  125. </div>
  126. <div>
  127. <p>{$h24['5']['time']}</p>
  128. <p>{$h24['5']['weather']}</p>
  129. <p>{$h24['5']['temp']}°C</p>
  130. </div>
  131. <div>
  132. <p>{$h24['6']['time']}</p>
  133. <p>{$h24['6']['weather']}</p>
  134. <p>{$h24['6']['temp']}°C</p>
  135. </div>
  136. <div>
  137. <p>{$h24['7']['time']}</p>
  138. <p>{$h24['7']['weather']}</p>
  139. <p>{$h24['7']['temp']}°C</p>
  140. </div>
  141. <div>
  142. <p>{$h24['8']['time']}</p>
  143. <p>{$h24['8']['weather']}</p>
  144. <p>{$h24['8']['temp']}°C</p>
  145. </div>
  146. <div>
  147. <p>{$h24['9']['time']}</p>
  148. <p>{$h24['9']['weather']}</p>
  149. <p>{$h24['9']['temp']}°C</p>
  150. </div>
  151. <div>
  152. <p>{$h24['10']['time']}</p>
  153. <p>{$h24['10']['weather']}</p>
  154. <p>{$h24['10']['temp']}°C</p>
  155. </div>
  156. <div>
  157. <p>{$h24['11']['time']}</p>
  158. <p>{$h24['11']['weather']}</p>
  159. <p>{$h24['11']['temp']}°C</p>
  160. </div>
  161. <div>
  162. <p>{$h24['12']['time']}</p>
  163. <p>{$h24['12']['weather']}</p>
  164. <p>{$h24['13']['temp']}°C</p>
  165. </div>
  166. <div>
  167. <p>{$h24['14']['time']}</p>
  168. <p>{$h24['14']['weather']}</p>
  169. <p>{$h24['14']['temp']}°C</p>
  170. </div>
  171. <div>
  172. <p>{$h24['15']['time']}</p>
  173. <p>{$h24['15']['weather']}</p>
  174. <p>{$h24['15']['temp']}°C</p>
  175. </div>
  176. <div>
  177. <p>{$h24['16']['time']}</p>
  178. <p>{$h24['16']['weather']}</p>
  179. <p>{$h24['16']['temp']}°C</p>
  180. </div>
  181. <div>
  182. <p>{$h24['17']['time']}</p>
  183. <p>{$h24['17']['weather']}</p>
  184. <p>{$h24['17']['temp']}°C</p>
  185. </div>
  186. <div>
  187. <p>{$h24['18']['time']}</p>
  188. <p>{$h24['18']['weather']}</p>
  189. <p>{$h24['18']['temp']}°C</p>
  190. </div>
  191. <div>
  192. <p>{$h24['19']['time']}</p>
  193. <p>{$h24['19']['weather']}</p>
  194. <p>{$h24['19']['temp']}°C</p>
  195. </div>
  196. <div>
  197. <p>{$h24['20']['time']}</p>
  198. <p>{$h24['20']['weather']}</p>
  199. <p>{$h24['20']['temp']}°C</p>
  200. </div>
  201. <div>
  202. <p>{$h24['21']['time']}</p>
  203. <p>{$h24['21']['weather']}</p>
  204. <p>{$h24['21']['temp']}°C</p>
  205. </div>
  206. <div>
  207. <p>{$h24['22']['time']}</p>
  208. <p>{$h24['22']['weather']}</p>
  209. <p>{$h24['22']['temp']}°C</p>
  210. </div>
  211. <div>
  212. <p>{$h24['23']['time']}</p>
  213. <p>{$h24['23']['weather']}</p>
  214. <p>{$h24['23']['temp']}°C</p>
  215. </div>
  216. <div>
  217. <p>{$h24['1']['time']}</p>
  218. <p>{$h24['1']['weather']}</p>
  219. <p>{$h24['1']['temp']}°C</p>
  220. </div>
  221. </div>
  222. </section>
  223. <section class="today">
  224. <!-- 今天 -->
  225. <div>
  226. <p>今天</p>
  227. </div>
  228. <div>
  229. {$daily1['day']['weather']}
  230. </div>
  231. <div>
  232. <p>{$daily1['day']['winddirect']}</p>
  233. {$daily1['day']['windpower']}
  234. </div>
  235. <div>{$daily1['day']['temphigh']}°C</div>
  236. <div>{$daily1['night']['templow']}°C</div>
  237. <!-- 明天 -->
  238. <div>明天</div>
  239. <div>{$daily2['day']['weather']}</div>
  240. <div><p>{$daily2['day']['winddirect']}</p>
  241. {$daily2['day']['windpower']}</div>
  242. <div>{$daily2['day']['temphigh']}°C</div>
  243. <div>{$daily2['night']['templow']}°C</div>
  244. <!-- 间隔 -->
  245. <div>后天</div>
  246. <div>{$daily3['day']['weather']}</div>
  247. <div><p>{$daily3['day']['winddirect']}</p>
  248. {$daily3['day']['windpower']}</div>
  249. <div>{$daily3['day']['temphigh']}°C</div>
  250. <div>{$daily3['night']['templow']}°C</div>
  251. <!-- 间隔 -->
  252. <div>{$daily4['week']}</div>
  253. <div>{$daily4['day']['weather']}</div>
  254. <div><p>{$daily4['day']['winddirect']}</p>
  255. {$daily4['day']['windpower']}</div>
  256. <div>{$daily4['day']['temphigh']}°C</div>
  257. <div>{$daily4['night']['templow']}°C</div>
  258. <!-- 间隔 -->
  259. <div>{$daily5['week']}</div>
  260. <div>{$daily5['day']['weather']}</div>
  261. <div><p>{$daily5['day']['winddirect']}</p>
  262. {$daily5['day']['windpower']}</div>
  263. <div>{$daily5['day']['temphigh']}°C</div>
  264. <div>{$daily5['night']['templow']}°C</div>
  265. <!-- 间隔 -->
  266. <div>{$daily6['week']}</div>
  267. <div>{$daily6['day']['weather']}</div>
  268. <div><p>{$daily6['day']['winddirect']}</p>
  269. {$daily6['day']['windpower']}</div>
  270. <div>{$daily6['day']['temphigh']}°C</div>
  271. <div>{$daily6['night']['templow']}°C</div>
  272. <!-- 间隔 -->
  273. <div>{$daily7['week']}</div>
  274. <div>{$daily7['night']['weather']}</div>
  275. <div><p>{$daily7['night']['winddirect']}</p>
  276. {$daily7['night']['windpower']}</div>
  277. <div>{$daily7['day']['temphigh']}°C</div>
  278. <div>{$daily7['night']['templow']}°C</div>
  279. </section>
  280. <!-- 指数 -->
  281. <section class="zhishu">
  282. <!-- 空气质量指数 -->
  283. <div>
  284. <p>空气质量指数</p>
  285. <p>{$aqi['quality']}</p>
  286. <p>{$aqi['aqiinfo']['affect']}</p>
  287. </div>
  288. <!-- 空调指数 -->
  289. <div>
  290. <p>空调指数</p>
  291. <p>{$index['0']['ivalue']}</p>
  292. <p>{$index['0']['detail']}</p>
  293. </div>
  294. <!-- 运动指数 -->
  295. <div>
  296. <p>运动指数</p>
  297. <p>{$index['1']['ivalue']}</p>
  298. <p>
  299. {$index['1']['detail']}
  300. </p>
  301. </div>
  302. <!-- 洗车指数 -->
  303. <div>
  304. <p>洗车指数</p>
  305. <p>{$index['4']['ivalue']}</p>
  306. <p>{$index['4']['detail']}</p>
  307. </div>
  308. <!-- 紫外线指数 -->
  309. <div>
  310. <p>紫外线指数</p>
  311. <p>{$index['2']['ivalue']}</p>
  312. <p>{$index['2']['detail']}</p>
  313. </div>
  314. <!-- 穿衣指数 -->
  315. <div>
  316. <p>穿衣指数</p>
  317. <p>{$index['6']['ivalue']}</p>
  318. <p>{$index['6']['detail']}</p>
  319. </div>
  320. <!-- 感冒指数 -->
  321. <div>
  322. <p>感冒指数</p>
  323. <p>{$index['3']['ivalue']}</p>
  324. <p>{$index['3']['detail']}</p>
  325. </div>
  326. <!-- 空气污染扩散指数 -->
  327. <div>
  328. <p>空气污染扩散指数</p>
  329. <p>{$index['5']['ivalue']}</p>
  330. <p>{$index['5']['detail']}</p>
  331. </div>
  332. </section>
  333. AAA;
  334. ;
  335. }else {
  336. echo $error.'或输入有误;';
  337. }
  338. ?>
  339. </fieldset>
  340. </main>
  341. </body>
  342. </html>

缩短网址源代码

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>压缩短网址</title>
  7. <style>
  8. * {
  9. margin: 0px;
  10. padding: 0px;
  11. box-sizing: border-box;
  12. }
  13. html {
  14. width: 100vw;
  15. font-size: 15px;
  16. }
  17. .img {
  18. width: 100vw;
  19. height: 100vh;
  20. position: fixed;
  21. top: 0px;
  22. left: 0px;
  23. z-index: -3;
  24. }
  25. .img img {
  26. width: 100%;
  27. height: 100%;
  28. }
  29. form {
  30. margin: auto;
  31. display: flex;
  32. flex-flow: column nowrap;
  33. width: 50vw;
  34. align-items: center;
  35. gap: 20px;
  36. }
  37. textarea {
  38. margin-top: 20vh;
  39. opacity: 0.5;
  40. color: black;
  41. padding: 10px;
  42. font-weight: bolder;
  43. border: none;
  44. border-radius: 15px;
  45. }
  46. main button {
  47. width: 200px;
  48. height: 40px;
  49. border: none;
  50. border-radius: 20px;
  51. margin-top: 30px;
  52. font-size: 1.5rem;
  53. box-shadow: 0px 0px 10px 5px lightblue;
  54. background-color: lightseagreen;
  55. }
  56. footer {
  57. margin: auto;
  58. text-align: center;
  59. margin-top: 20px;
  60. }
  61. footer button {
  62. margin-top: 20px;
  63. width: 150px;
  64. height: 35px;
  65. border: none;
  66. background-color: lightcyan;
  67. border-radius: 10px;
  68. }
  69. </style>
  70. </head>
  71. <body>
  72. <!-- 背景图 -->
  73. <div class="img">
  74. <img src="https://i.loli.net/2020/04/22/ncwEAPab2GSQhtC.jpg" alt="" />
  75. </div>
  76. <main>
  77. <form action="" method="POST">
  78. <textarea name="url" id="url" cols="40" rows="10" placeholder="请输入原始链接"></textarea>
  79. <button>缩 短</button>
  80. </form>
  81. </main>
  82. <?php
  83. // 关闭报错
  84. // error_reporting(0);
  85. if (isset($_POST['url']) && $_POST['url'] != null) {
  86. // 创建随机4位字母 97-122 为小写
  87. $code = '';
  88. for ($i=1; $i <=2 ; $i++) {
  89. $code .= chr(rand(97,122));
  90. }
  91. // 创建目录 目录名为随机字母
  92. $pcode = &$code;
  93. $a = 'a/'.$pcode;
  94. mkdir($a,0777,false);
  95. // 取地址符
  96. $acode = &$a;
  97. // 打开该文件夹并创建index.html
  98. $hcode = $acode.'/index.html';
  99. // var_dump($hcode);
  100. $handle = fopen($hcode,'w')or die('open file faill');
  101. // 文件内容
  102. $ahtml = $_POST['url'];
  103. $html = <<< ABC
  104. <script type="text/javascript">
  105. window.open('{$ahtml}');
  106. </script>
  107. ABC;
  108. // heredoc 里面不能有空格否则会原样输出导致js运转不正常
  109. // 写入文件
  110. fprintf($handle,sprintf($html));
  111. }
  112. if( empty($ahtml)) {
  113. echo <<< BBB
  114. <footer>
  115. 请输入原始连接
  116. </footer>
  117. BBB;
  118. }else {
  119. echo <<< AAA
  120. <footer>
  121. 转换成功
  122. <p id="copy">{$_SERVER['SERVER_NAME']}/{$acode}</p>
  123. <button onclick="copyFn()">一键复制</button>
  124. </footer>
  125. AAA;
  126. }
  127. ?>
  128. <script>
  129. function copyFn() {
  130. var val = document.getElementById("copy");
  131. window.getSelection().selectAllChildren(val);
  132. document.execCommand("Copy");
  133. alert("复制成功");
  134. }
  135. </script>
  136. </body>
  137. </html>

路漫漫其修远兮,吾将上下而求索

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