是否有一个 PHP 函数可以在应用正则表达式之前转义它们?

是否有一个 PHP 函数可以在应用正则表达式之前转义它们?

我正在寻找类似于 C # Regex.Escape()函数的东西。

53440 次浏览

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 "
// }

T-Regx使用 预备模式会安全得多:

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


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

然后进行正常匹配:

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


$matcher = pattern->match($haystack);
$matches = $match->all();

你甚至可以和 preg_match()一起使用它:

preg_match($pattern, 'foo', $matches);