Is there a PHP function that can escape regex patterns before they are applied?
PhpRegexEscapingPhp Problem Overview
Is there a PHP function that can escape regex patterns before they are applied?
I am looking for something along the lines of the C# Regex.Escape()
function.
Php Solutions
Solution 1 - Php
preg_quote()
is what you are looking for:
> ## Description
>
> string preg_quote ( string $str [, string $delimiter = NULL ] )
>
> preg_quote() takes str
and puts a
> backslash in front of every character
> that is part of the regular expression
> syntax. This is useful if you have a
> run-time string that you need to match
> in some text and the string may
> contain special regex characters.
>
> The special regular expression
> characters are: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
>
> ## Parameters
>
>
> ### str
> The input string.
>
> ### delimiter
> If the optional delimiter is specified, it will also be escaped. This is useful for escaping the delimiter that is required by the PCRE functions. The / is the most commonly used delimiter.
Importantly, note that if the $delimiter
argument is not specified, the delimiter - the character used to enclose your regex, commonly a forward slash (/
) - will not be escaped. You will usually want to pass whatever delimiter you are using with your regex as the $delimiter
argument.
preg_match
to find occurrences of a given URL surrounded by whitespace:
Example - using $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 "
// }
Solution 2 - Php
It would be much safer to use Prepared Patterns from T-Regx:
$url = 'http://stackoverflow.com/questions?sort=newest';
$pattern = Pattern::inject('\s@\s', [$url]);
// ↑ $url is quoted
then perform normal match:
$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
$matcher = pattern->match($haystack);
$matches = $match->all();
you can even use it with preg_match()
:
preg_match($pattern, 'foo', $matches);