PHP 為 Regex 加跳脫字元 的 function: quotemeta

使用 Regular expression 時, 有以下這些特殊用途的符號:

. \ + * ? [ ^ ] ( $ )

若要處理某些輸入, 直接丟給 preg_match / preg_replace.. 等 使用, 就會有出乎意料外的結果.

要避免此意外, 丟進去前, 要先將那字串做處理, quotemeta 會 對特殊用途的符號加上 跳脫字元(backslash)"\".

例如:

<?php
$str = 'ooxx...book+pen...123';
$ex = 'book+pen';
print_r(preg_replace("/$ex/", '', $str)); // ooxx...book+pen...123

$ex = quotemeta('book+pen');
print_r(preg_replace("/$ex/", '', $str)); // ooxx......123
?>

使用上述做法的主要用途在於 $ex 的變數, 是隨時做改變的. (function 的變數或是外來的變數等)

若是 固定字串, 有簡單又快速的方式處理:

<?php
$str = 'ooxx...book+pen...123';
print_r(preg_replace("/\Qbook+pen\E/", '', $str)); // ooxx......123
print_r(str_replace("book+pen", '', $str)); // ooxx......123
?>

附註:

  • Regex 中: \Q\E 包住的字串, 會將此字串直接做取代,不會理會裡面的特殊符號.
  • str_replace() 用來取代固定字串, 速度會比 preg_replace 快上 N 倍.

 

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料