所有
我使用preg_match来过滤一些数据,奇怪的是,它无法正常工作。我是regex的新手,我使用php live regex网站检查我的正则表达式,它正常工作。所以我不知道这里有什么问题。 我想让preg_match在$ string中找到类似“a \ _b”的东西:
$string="aaa\_bbb:ccc"
if(preg_match("/[a-zA-Z]\\_[a-zA-Z]/", $string)){
$snew = str_replace('\_', "_", $string);
}
但奇怪的是,即使我在上面这个例子中有一个$ string,preg_match的结果是0.但是当我把它改成
时preg_match("/\\_[a-zA-Z]/", $string)
它工作正常并返回1.但当然这不是我想要的。任何的想法? 非常感谢〜
答案 0 :(得分:5)
根据我所见,您根本不需要preg_match
。
然而,你遇到的问题与逃避有关。
你有这个:"/[a-zA-Z]\\_[a-zA-Z]/"
您已正确识别反斜杠需要转义,但是,您错过了一个微妙的问题:
PHP中的正则表达式是字符串。这意味着您需要将其作为字符串以及正则表达式进行转义。实际上,这意味着要正确地转义反斜杠以使其与模式中的实际反斜杠字符匹配,实际上需要四个反斜杠。
"/[a-zA-Z]\\\\_[a-zA-Z]/"
它不漂亮,但就是这样。
希望有所帮助。
答案 1 :(得分:3)
使用:
if(preg_match("/[a-zA-Z]\\\\_[a-zA-Z]/", $string))
代替
答案 2 :(得分:1)
您完全不需要preg_match
,只需使用此正则表达式进行替换:
/([a-zA-Z])\\\\_([a-zA-Z])/
然后替换为$1_$2
,如下所示:
$result = preg_replace("/([a-zA-Z])\\\\_([a-zA-Z])/", "$1_$2$, $string);