user547363
user547363

Reputation: 1229

Delimiter must not be alphanumeric or backslash and preg_match

I have this code :

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches);
echo $matches[1];

and when im run it returns this error:

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

Upvotes: 114

Views: 207288

Answers (8)

Hashim Aziz
Hashim Aziz

Reputation: 6127

It turns out you get the same error when you pass arguments to preg_match in the wrong order. Make sure that you're passing arguments in the following order , where only the first two are required:

preg_match($regex_pattern, $string_to_search, $matches, $flags, $offset);

Upvotes: 0

Vikas Naranje
Vikas Naranje

Reputation: 2402

Please try with this

$pattern = "/My name is '\(.*\)' and im fine/"; 

Upvotes: -1

Nubian
Nubian

Reputation: 161

Maybe not related to original code example, but I received the error "Delimiter must not be alphanumeric or backslash" and Googled here. Reason: I mixed order of parameters for preg_match. Pattern was the second parameter and string to match was first. Be careful :)

Upvotes: 1

Danon
Danon

Reputation: 2973

You can also use T-Regx library which has automatic delimiters for you:

$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();

                 // ↑ No delimiters needed 

Upvotes: 0

iconoclast
iconoclast

Reputation: 22630

The solution (which other answers don't mention—at least at the time of my originally writing this) is that when PHP refers to delimiters, it's not referring to the delimiters you see in your code (which are quote marks) but the next characters inside the string. (In fact I've never seen this stated anywhere in any documentation: you have to see it in examples.) So instead of having a regular expression syntax like what you may be accustomed to from many other languages:

/something/

PHP uses strings, and then looks inside the string for another delimiter:

'/something/'

The delimiter PHP is referring to is the pair of / characters, instead of the pair of ' characters. So if you write 'something', PHP will take s as the intended delimiter and complain that you're not allowed to use alphanumeric characters as your delimiter.

So if you want to pass (for instance) an i to show that you want a case-insensitve match, you pass it inside the string but outside of the regex delimiters:

'/something/i'

If you want to use something other than / as your delimiter, you can, such as if you're matching a URL and don't want to have to escape all the slashes:

'~something~'

Upvotes: 86

TheTechGuy
TheTechGuy

Reputation: 17374

The pattern must have delimiters. Delimiters can be a forward slash (/) or any non alphanumeric characters(#,$,*,...). Examples

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#";
$pattern = "@My name is '(.*)' and im fine@";  

Upvotes: 8

Ben Swinburne
Ben Swinburne

Reputation: 26477

You must specify a delimiter for your expression. A delimiter is a special character used at the start and end of your expression to denote which part is the expression. This allows you to use modifiers and the interpreter to know which is an expression and which are modifiers. As the error message states, the delimiter cannot be a backslash because the backslash is the escape character.

$pattern = "/My name is '(.*)' and im fine/";

and below the same example but with the i modifier to match without being case sensitive.

$pattern = "/My name is '(.*)' and im fine/i";

As you can see, the i is outside of the slashes and therefore is interpreted as a modifier.

Also bear in mind that if you use a forward slash character (/) as a delimiter you must then escape further uses of / in the regular expression, if present.

Upvotes: 25

Paul
Paul

Reputation: 6871

You need a delimiter for your pattern. It should be added at the start and end of the pattern like so:

$pattern = "/My name is '(.*)' and im fine/";  // With / as a delimeter 

Upvotes: 163

Related Questions