適用される前に正規表現パターンをエスケープできるPHP関数はありますか?


161

適用される前に正規表現パターンをエスケープできるPHP関数はありますか?

私はC#Regex.Escape()関数の線に沿って何かを探しています。

回答:


254

preg_quote() あなたが探しているものです:

説明

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote()str 、正規表現構文の一部であるすべての文字の前にバックスラッシュを取り、配置します。これは、一部のテキストで照合する必要があるランタイム文字列があり、その文字列に特殊な正規表現文字が含まれている可能性がある場合に役立ちます。

特別な正規表現文字は次のとおりです。 . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

パラメーター

str

入力文字列。

デリミタ

オプションの区切り文字が指定されている場合は、それもエスケープされます。これは、PCRE関数で必要な区切り文字をエスケープするのに役立ちます。/は、最も一般的に使用される区切り文字です。

重要なことに、$delimiter引数が指定されていない場合、区切り文字(正規表現を囲むために使用される文字、通常はスラッシュ(/))はエスケープされないことに注意してください。通常、正規表現で使用している区切り文字を$delimiter引数として渡します。

例-を使用preg_matchして、空白で囲まれた特定のURLの出現を検索します。

$url = 'http://stackoverflow.com/questions?sort=newest';

// preg_quote escapes the dot, question mark and equals sign in the URL (by
// default) as well as all the forward slashes (because we pass '/' as the
// $delimiter argument).
$escapedUrl = preg_quote($url, '/');

// We enclose our regex in '/' characters here - the same delimiter we passed
// to preg_quote
$regex = '/\s' . $escapedUrl . '\s/';
// $regex is now:  /\shttp\:\/\/stackoverflow\.com\/questions\?sort\=newest\s/

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
preg_match($regex, $haystack, $matches);

var_dump($matches);
// array(1) {
//   [0]=>
//   string(48) " http://stackoverflow.com/questions?sort=newest "
// }

11
@TomHaighの回答に対するもう1つの注意は、2番目の$delimiter引数を指定しない場合、「デフォルト」(または最も一般的な)も含めてpreg_quote() 区切り文字をエスケープしませ/
Alix Axel

私はこの答えにたくさんのものを追加しました- $delimiter引数の重要性、ドキュメントからのその引数の説明、正確にそれが何を意味するのかについての混乱の明確化について@AlixAxelが持ち出したメモpreg_quoteプログラムで正規表現を作成し、それを別のpreg_*関数に入れるために実際に使用されている場所を思いつくことができる最も単純なケースで使用されていることを示すコメント付きの例(そうでなければ、何がポイントなのか?)変更が気に入らない場合は、遠慮なくロールバックしてください。
Mark Amery

1

使用することがより安全になる準備パターンをからT-REGXライブラリ

$url = 'http://stackoverflow.com/questions?sort=newest';

$pattern = Pattern::prepare(['\s', [$url], '\s']);
                                // ↑ $url is quoted

次に、通常のt-regx一致を実行します。

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";

$matches = $pattern->match($haystack)->all();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.