web-dev-qa-db-ja.com

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

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

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

155
vfclists

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

説明

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

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

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

パラメーター

str

入力文字列。

デリミタ

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

重要なことに、_$delimiter_引数が指定されていない場合、 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 "
// }
_
247
Tom Haigh

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;
1
Danon