zhihong
zhihong

Reputation: 1916

preg_match dose not work correctly in php

all,

I am using preg_match to filter some data, and it is strange that, it dose not work correctly. I am new to regex, and I used a php live regex website to check my regex, which works correctly. So I have no idea what is wrong here. I would like to have preg_match to find something like "a\_b" in the $string:

$string="aaa\_bbb:ccc"
if(preg_match("/[a-zA-Z]\\_[a-zA-Z]/", $string)){
    $snew = str_replace('\_', "_", $string);
}

But it is strange that even I have a $string like in this example above, the result of preg_match is 0. But when I change it to

preg_match("/\\_[a-zA-Z]/", $string)

It works fine and return 1. But of course that is not what I want. Any idea? Thanks very much~

Upvotes: 0

Views: 173

Answers (3)

Ibrahim Najjar
Ibrahim Najjar

Reputation: 19423

You don't need the preg_match altogether, instead just do a replace using this regex:

/([a-zA-Z])\\\\_([a-zA-Z])/

and then replace with $1_$2, like this:

$result = preg_replace("/([a-zA-Z])\\\\_([a-zA-Z])/", "$1_$2$, $string);

Upvotes: 1

Spudley
Spudley

Reputation: 168685

You don't really need the preg_match at all, from what I can see.

However the problem you're having with it is to do with escaping.

You have this: "/[a-zA-Z]\\_[a-zA-Z]/"

You've correctly identified that the backslash needs to be escaped, however, you've missed a subtle issue:

Regular expressions in PHP are strings. This means that you need to escape it as a string as well as a regular expression. In effect, this means that to correctly escape a backslash so it is matched as an actual backslash character in your pattern, you actually need to have four backslashes.

"/[a-zA-Z]\\\\_[a-zA-Z]/"

It's not pretty, but that's how it is.

Hope that helps.

Upvotes: 5

ohmygirl
ohmygirl

Reputation: 239

use:

if(preg_match("/[a-zA-Z]\\\\_[a-zA-Z]/", $string))

instead

Upvotes: 3

Related Questions