iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Software Development

用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!系列 第 14

【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)/

上一篇
【PHP Telegram Bot】Day13 - 基礎(2):數學運算與亂數
下一篇
【PHP Telegram Bot】Day15 - 基礎(4):陣列處理、JSON
系列文
用 PHP 打造專屬於自己的 Telegram 聊天機器人吧!30

尚未有邦友留言

立即登入留言