適用される前に正規表現パターンをエスケープできるPHP関数はありますか?
私はC#Regex.Escape()
関数の線に沿って何かを探しています。
適用される前に正規表現パターンをエスケープできるPHP関数はありますか?
私はC#Regex.Escape()
関数の線に沿って何かを探しています。
回答:
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 "
// }
$delimiter
引数の重要性、ドキュメントからのその引数の説明、正確にそれが何を意味するのかについての混乱の明確化について@AlixAxelが持ち出したメモpreg_quote
プログラムで正規表現を作成し、それを別のpreg_*
関数に入れるために実際に使用されている場所を思いつくことができる最も単純なケースで使用されていることを示すコメント付きの例(そうでなければ、何がポイントなのか?)変更が気に入らない場合は、遠慮なくロールバックしてください。
使用することがより安全になる準備パターンをから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();
$delimiter
引数を指定しない場合、「デフォルト」(または最も一般的な)も含めて、preg_quote()
区切り文字をエスケープしません/
。