PHP Conference Japan 2024

分隔符

使用 PCRE 函式時,需要用分隔符將模式括起來。分隔符可以是任何非字母數字、非反斜線、非空白字元。有效分隔符前的空白會被忽略。

常用的分隔符是斜線 (/)、井字號 (#) 和波浪號 (~)。以下都是有效的帶分隔符模式的範例。

/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%

也可以使用括號樣式的分隔符,其中左括號和右括號分別是起始和結束分隔符。(){}[]<> 都是有效的括號樣式分隔符對。

(this [is] a (pattern))
{this [is] a (pattern)}
[this [is] a (pattern)]
<this [is] a (pattern)>
括號樣式的分隔符號在模式中作為元字符使用時不需要轉義,但與其他分隔符號一樣,當它們作為字面字符使用時必須轉義。

如果分隔符號需要在模式內進行匹配,則必須使用反斜線進行轉義。如果分隔符號在模式內頻繁出現,則最好選擇另一個分隔符號以提高可讀性。

/http:\/\//
#http://#
preg_quote() 函數可用於轉義要注入模式的字串,其可選的第二個參數可用於指定要轉義的分隔符號。

您可以在結束分隔符號後添加模式修飾符。以下是不區分大小寫匹配的示例

#[a-z]#i

新增註記

使用者貢獻的註記 3 則註記

Pedro Gimeno
9 年前
請注意,括號樣式的開始和結束分隔符號並非 100% 沒有問題的解決方案,因為當它們在表達式中不成對出現時,需要進行轉義。這種不匹配的情況可能發生在它們出現在字元類別 [...] 中時,因為大多數元字符會失去其特殊含義。請參考以下範例

<?php
preg_match
('{[{]}', ''); // 警告:preg_match(): 沒有結束匹配分隔符號 '}'
preg_match('{[}]}', ''); // 警告:preg_match(): 未知的修飾符 ']'
preg_match('{[}{]}', ''); // 警告:preg_match(): 未知的修飾符 ']'
?>

轉義它們可以解決這個問題

<?php
preg_match
('{[\{]}', ''); // 正常
preg_match('{[}]}', ''); // 正常
preg_match('{[\}\{]}', ''); // 正常
?>
Munin
9 年前
preg_match('{[}]}', ''); // 警告:preg_match(): 未知的修飾符 ']'

preg_match('{[\}]}', ''); // 正常
Revo
5 年前
請注意,當您必須使用像是原子群組或後向斷言之類的高級叢集時,不應該使用角括號 `<>` 作為分隔符號,因為它們包含的角括號不是成對出現的,而且轉義也沒有幫助。
To Top