【PHP Telegram Bot】Day14 - 基础(3):字串处理与正规表示式

在程序里第二个常出现的就是字串处理啦

运算子

连接运算子 说明 用法
. 连接 x . y
.= 连接并赋值 x .= y

在 PHP 中字串是用 . 连接,如果用 + 会变成数字相加

echo 3 . "2.5", "\n"; // 32.5
echo 3 + "2.5", "\n"; // 5.5
比较运算子 说明 用法
== 相等(值) x == y
!= 不相等(值) x != y
=== 相等(型别 and 值) x === y
!== 不相等(型别 or 值) x !== y
< 小於 x < y
> 大於 x > y
>= 大於 or 等於 x >= y
<= 小於 or 等於 x <= y
<> 大於 or 小於 x <> y
<=> 小於返回 -1, 等於返回 0, 大於返回 1 x <=> y

除了检查字串相等,其他的虽然也不会出错,但应该很少会用到

大於小於会从第一个字开始往後比较

var_dump("a" == "b");  // bool(false)
var_dump("a" != "b");  // bool(true)
var_dump("a" === "b"); // bool(false)
var_dump("a" !== "b"); // bool(true)
var_dump("ac" < "b");  // bool(true)
var_dump("a" > "b");   // bool(false)
var_dump("a" >= "a");  // bool(true)
var_dump("a" <= "b");  // bool(true)
var_dump("a" <=> "b"); // int(-1)

单引号字串

单引号字串不处理「跳脱字元」与「变数解析」,只有两种情况反斜线 \ 有作用,分别是 \'\\

echo '\'', "\n";     // '
echo '\\', "\n";     // \

echo '\n', "\n";     // \n
echo '$value', "\n"; // $value

双引号字串

跳脱字元/序列 Escaped Characters/Sequences

序列 说明
\n Enter (LF)
\r Return (CR)
\t TAB
\\ \
\$ $
\" "

跳脱字元最常用的就是换行 \n 了吧,另外在双引号字串中要打 " 也会用到

echo "\"\n\$";
// "
// $

全部跳脱字元:https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double

变数解析 Variable parsing

变数解析是一个很方便的功能,用字串连接的话,要打一堆 ". 实在很麻烦

$age = 16;
echo "My age is " . $age . ".";
echo "My age is ${age}.";

内建函式

函式 说明 用法
echo 输出 echo $a, $b, ...
trim() 清除头尾字元 trim($str, $a = "\t\n\r\0\x0B")
strlen() 长度 strlen($str)
strrev() 反转 strrev($str)
str_replace() 取代 str_replace($a, $b, $str)
str_split() 等分 str_split($str, $len = 1)
explode() 分割 explode($a, $str, $limit)
implode() 合并成字串 implode($a, $array)
strstr() 以字串位置分割 strstr($str, $a)
substr() 以位置与长度裁切 substr($str, $start, $len)
strpos() 查找字串首次出现位置 strpos($str, $a)
mb_strpos() 查找字串首次出现位置(UTF-8) mb_strpos($str, $a)
stripos() 查找字串首次出现位置(不区分大小写) stripos($str, $a)
mb_stripos() 查找字串首次出现位置(不区分大小写)(UTF-8) mb_stripos($str, $a)
strrpos() 查找字串最後出现位置 strrpos($str, $a)
mb_strrpos() 查找字串最後出现位置(UTF-8) mb_strrpos($str, $a)
strripos() 查找字串最後出现位置(不区分大小写) strripos($str, $a)
mb_strripos() 查找字串最後出现位置(不区分大小写)(UTF-8) mb_strripos($str, $a)

PHP 最为人诟病的地方就是一大堆差不多的函式,其实有很大一部分是有规则的

  • mb_ UTF-8 模式(需启用 mbstring
  • i 不区分大小写
  • r 从尾巴开始找

所有字串函式:


正规表示式 Regular Expressions

最常见的函式应该就这两个吧:

  1. preg_match_all() 正规查询
  2. preg_replace() 正规替换

还有这个好用的网站:

最後是符号的说明:

表示式 说明
\ 避开特殊符号
\n Enter
\r Return
\t TAB
\s 空白 [\f\n\r\t\v ]
\S 非空白 [^\f\n\r\t\v ]
\d 数字 [0-9]
\D 非数字 [^0-9]
\w 数字、字母或底线 [0-9A-Za-z_]
\W 非数字、字母和底线 [^0-9A-Za-z_]
. 除了换行以外的任意字元 [^\r\n]
[m-n] m ~ n 其中一个
[^m-n] 不能是 m ~ n 其中一个
[xyz] x 或 y 或 z
[^xyz] 非(x 和 y 和 z)
^ 字串开头
$ 字串结尾
* 0 次或很多次
+ 1 次或很多次
? 0 次或 1 次
{n} n 次
{n,} n 次到无限次
{n,m} n ~ m 次
(X|Y) X 或 Y
(?:X|Y) X 或 Y 但不返回群组
(?>X|Y) X 或 Y 但不返回群组(左界右推)
(?<=Y)X X 前面必须是 Y
(?<!Y)X X 前面不行是 Y
X(?=Y) X 後面必须是 Y
X(?!Y) X 後面不行是 Y
(?F)X X 以修饰符 F 方式匹配
(?F:X)Y X 以修饰符 F 方式匹配,Y 则否
修饰符 说明
i 不区分大小写
m ^$ 匹配行首和行尾
s . 匹配所有字元,包含 \r \n
U 非贪婪模式(尽可能少匹配)
u 匹配 UTF-8 字元

所有修饰符:https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

$str = 'abcaaabbacaa';
preg_match_all('/(?:.+)a+/', $str, $m);
print_r($m[0]);
// [0] => abcaaabbacaa
preg_match_all('/(?:.+)a+/U', $str, $m);
print_r($m[0]);
// [0] => abca
// [1] => aa
// [2] => bba
// [3] => ca
preg_match_all('/(?U:.+)a+/', $str, $m);
print_r($m[0]);
// [0] => abcaaa
// [1] => bba
// [2] => caa
preg_match_all('/(?>(?U:.+))a+/', $str, $m);
print_r($m[0]);
// [0] => caaa
// [1] => ba
// [2] => caa
preg_match_all('/(?>.+)a+/', $str, $m);
print_r($m[0]);
// no match
preg_match_all('/(?>.+)a+/U', $str, $m);
print_r($m[0]);
// [0] => ca
// [1] => aa
// [2] => ba
// [3] => ca
preg_match_all('/a{2}/', $str, $m);
print_r($m[0]);
// [0] => aa
// [1] => aa
preg_match_all('/(?<!a)a{2}(?!a)/', $str, $m);
print_r($m[0]);
// [0] => aa

/(?:.+)a+/ /(?:.+)a+/U
/(?U:.+)a+/ /(?>(?U:.+))a+/
/(?>.+)a+/ /(?>.+)a+/U
/a{2}/ /(?<!a)a{2}(?!a)/

<<:  [Day8] 有意识地沟通:每个成员都有自己的功课

>>:  Day 8 情报收集 - Information Gathering (SSL Analysis)

Day09_插班车~风险评估的概念应用在日常工作上~XD"

今天这个,真的是插班车,因为今天作完弱扫,总共八份的测报。 我自已看得都要吐了。 在思考,这个月,因...

[Day2][笔记] React.js 常用 的 ES6 语法(1)

前言 React.js 是一套 JavaScript 函式库,而其写法也的确如同其字面上意思,写起来...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 8 - 用 beforeEach 归纳重复行为

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 当测试脚本有重复的地方,除了可以写...

新新新手阅读 Angular 文件 - Add Services - Day08

声明一下 这边要声明一下,这一篇其实应该出现在 Day07 的内容之前才对,所以,如果真的有读者 f...

# Day19--从Sruct、Class的本质差异论MVC

本篇内容来自於我在Medium上写的一篇文章:Swift 语法再读#1 [Between Struc...