0

全部,

我正在使用 preg_match 过滤一些数据,奇怪的是,它不能正常工作。我是 regex 的新手,我使用了一个 php live regex 网站来检查我的 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。但这当然不是我想要的。任何想法?非常感谢~

4

3 回答 3

5

据我所知,你根本不需要preg_match

但是,您遇到的问题与转义有关。

你有这个:"/[a-zA-Z]\\_[a-zA-Z]/"

您已经正确地确定需要转义反斜杠,但是,您错过了一个微妙的问题:

PHP 中的正则表达式是字符串。这意味着您需要将其转义为字符串正则表达式。实际上,这意味着要正确转义反斜杠以便将其匹配为模式中的实际反斜杠字符,您实际上需要有四个反斜杠。

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

它不漂亮,但就是这样。

希望有帮助。

于 2013-10-15T11:47:12.840 回答
3

利用:

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

反而

于 2013-10-15T11:45:57.847 回答
1

您完全不需要preg_match,只需使用此正则表达式进行替换:

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

然后替换为$1_$2,如下所示:

$result = preg_replace("/([a-zA-Z])\\\\_([a-zA-Z])/", "$1_$2$, $string);
于 2013-10-15T11:40:37.427 回答