Is there a PHP function that can escape regex patterns before they are applied?

PhpRegexEscaping

Php 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.

Example - using preg_match to find occurrences of a given URL surrounded by whitespace:
$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);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionvfclistsView Question on Stackoverflow
Solution 1 - PhpTom HaighView Answer on Stackoverflow
Solution 2 - PhpDanonView Answer on Stackoverflow