关于正则中括号里的转移字符\

hphper 发布于 2016/09/06 14:58
阅读 634
收藏 0

代码如下

<?php
$str=$_GET['a'];
if (preg_match('#[\\\]#', $str)) {
   echo "yes";
}else{
    echo "no";
}



为何匹配一个\需要3个\在[]里呢,2个不行,\本身是转义字符,用\转一次不就能匹配了吗,为啥得写3个?
加载中
2
乌龟壳
乌龟壳

这是一个比较典型的分层设计引起的,理解这个问题需要把每一层都了解清楚

第一层:正则规定,匹配\需要\\来表示

第二层:PHP规定,要在代码里表达\,需要\\

第三层:糅合1、2层,可得,在PHP代码里表达正则的【匹配\】功能,需要\\\\四个反斜杠

证明:echo "\\\\"; (结果是输出\\,\\就是正则要求的匹配反斜杠的写法)

特例:PHP里面,如果\后面跟着的不是特殊的几个标识,那就不转义

证明:echo "[\\\]"; (结果是输出[\\])

乌龟壳
乌龟壳
回复 @hphper : 我改过答案,说明了这种情况,但是网站缓存有问题没更新。你再看下
hphper
hphper
我代码里写3个\和4个\ 效果是一样的啊
2
0
zabcd117
zabcd117
我猜是这样的,前两个'\\'匹配为一个'\',后面的'\]',匹配']',因为'[]'在正则中,有匹配的里面任意字符的作用,所以你的要求是匹配字符串中包含中括号,还是匹配一个被'#'包含的字符里面可以有'\'
hphper
hphper
回复 @zabcd117 : 肯定需要转义的,但是应该2个\\就能匹配\字符了吧,为啥需要3个呢
zabcd117
zabcd117
回复 @hphper : '/#[^\\]*\\[^\\]*#/i',这样在js里面可以,但是我不确定,php里面单引号和双引号对于'\'本身是不是需要转义,你可以自己确定下。
hphper
hphper
匹配\字符
返回顶部
顶部