想知道為什麼您的 preg_replace 失敗了,即使您使用了 preg_quote?
嘗試新增定界符號 / - preg_quote($string, '/');
(PHP 4, PHP 5, PHP 7, PHP 8)
preg_quote — 將正規表示式字元加上引號
preg_quote() 接受 str
並在每個屬於正規表示式語法的字元前面加上反斜線。如果您有一個執行時期字串需要在某些文字中進行比對,且該字串可能包含特殊的正規表示式字元,則此函式很有用。
特殊的正規表示式字元有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : - #
注意,/
並非特殊的正規表達式字元。
注意事項:
請注意,preg_quote() 不適用於 preg_replace() 等函式的 $replacement 字串。
str
輸入字串。
delimiter
如果指定了可選的 delimiter
參數,它也會被跳脫。這對於跳脫 PCRE 函式所需的定界符號很有用。/
是最常用的定界符號。
回傳已引號括住(已跳脫)的字串。
版本 | 說明 |
---|---|
7.3.0 | # 字元現在會被引號括住 |
7.2.0 |
delimiter 現在可以為 null。 |
範例 #1 preg_quote() 範例
<?php
$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // 回傳 \$40 for a g3\/400
?>
範例 #2 將文字中的單字設為斜體
<?php
// 在此範例中,preg_quote($word) 用於防止
// 星號 (*) 對正規表達式具有特殊意義。
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/" . preg_quote($word, '/') . "/",
"<i>" . $word . "</i>",
$textbody);
?>
注意:此函式是二進位安全的。
要跳脫具有特殊意義的字元,例如: .-[]() 等等,請使用 \Q 和 \E。
例如
<?php echo ( preg_match('/^'.( $myvar = 'te.t' ).'$/i', 'test') ? 'match' : 'nomatch' ); ?>
結果為:match
但是
<?php echo ( preg_match('/^\Q'.( $myvar = 'te.t' ).'\E$/i', 'test') ? 'match' : 'nomatch' ); ?>
結果為:nomatch
需要注意的是,正斜線不會被跳脫。由於許多正規表達式都以正斜線括起來,如果您在正規表達式中將正斜線作為文字使用,則必須自行跳脫它,否則它會終止正規表達式。
特殊字元列表並不完整
--- 範例程式碼 ---
$specials = '.\+*?[^]$(){}=!<>|:-';
for ($i = 0; $i <= 255; $i++) {
if (chr($i) !== preg_quote(chr($i))) {
printf("字元 0x%02x 已跳脫%s\n",
$i,
(strpos($specials, chr($i)) === FALSE) ? ' (+)' : '');
} /* if */
} /* for */
--- 範例程式碼 ---
--- 輸出 ---
字元 0x00 已跳脫 (+)
字元 0x21 已跳脫
字元 0x24 已跳脫
字元 0x28 已跳脫
字元 0x29 已跳脫
字元 0x2a 已跳脫
字元 0x2b 已跳脫
字元 0x2d 已跳脫
字元 0x2e 已跳脫
字元 0x3a 已跳脫
字元 0x3c 已跳脫
字元 0x3d 已跳脫
字元 0x3e 已跳脫
字元 0x3f 已跳脫
字元 0x5b 已跳脫
字元 0x5c 已跳脫
字元 0x5d 已跳脫
字元 0x5e 已跳脫
字元 0x7b 已跳脫
字元 0x7c 已跳脫
字元 0x7d 已跳脫
--- 輸出 ---
我發現,除了跳脫特殊正規表達式字元之外,`preg_quote()` 還會將空位元組 (NUL byte) 編碼為其八進位表示法。
<?php
var_dump(preg_quote("\0"));
?>
輸出
string(4) "\000"
若要更精細地控制您的模式外觀,請嘗試使用 T-Regx
Pattern::inject('This is (my|our) pattern: @', [$_GET['name']]);