是否有一个PHP函数可以在应用正则表达式模式之前对其进行转义?


161

是否有一个PHP函数可以在应用正则表达式模式之前对其进行转义?

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

Answers:


254

preg_quote() 您正在寻找的是:

描述

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

preg_quote()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答案,如果不指定第二个$delimiter参数preg_quote() 也不会逃避任何分隔符,甚至没有“默认”(或最常见的)/
Alix Axel 2012年

我在此答案中添加了很多东西-@AlixAxel提出的有关$delimiter参数重要性的注释,文档中对该参数的描述,对确切含义的混淆的澄清以及大量内容注释过的示例显示preg_quote了在最简单的情况下使用的示例,我可以想出它实际上用于以编程方式形成正则表达式并将其放入另一个preg_*函数的地方(否则,这有什么用?)。如果您不喜欢更改,请随时回滚。
Mark Amery

1

使用来自T-Regx库的Prepared Patterns要安全得多:

$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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.