php中的转义字符——迹忆客-ag捕鱼王app官网
转义字符语法
转义字符要使用反斜线(\)
来完成。如果反斜线后面跟着一个具有特殊含义的特殊字符(非字母数字)。那么该特殊字符的特殊含义将消失,变成一个普通的字符。例如,如果我们要匹配字符串中的*
,我们知道,*
在正则表达式中是一个量词,是有其特殊用途的,所以可以在正则表达式中写成\*
,这样就成了一个普通的*
字符。
注意:反斜线
(\)
本身也是一个特殊的字符,所以如果我们想要匹配字符串中的反斜线,按照上面的理论需要对正则中的反斜线(\)
进行转义,也就是在它前面再加一个反斜线——(\\)
。然而这是有问题的,我们知道,正则表达式也是一个字符串,不管是单引号还是双引号的字符串,其中的反斜线都有特殊的含义,所以正则中的(\\)
,解析出来之后是/\/
。而正则表达式的引擎收到/\/
之后,认为反斜线(\)
是转义标记,会将分隔符/
转义,因此会得到一个错误。所以说如果想匹配字符串中的反斜线,那正则表达式中要写成四个反斜线(\\\\)
。这样正则表达式引擎收到的是/\\/
,才会去正常匹配。
我们再来举一个典型的例子:匹配目标字符串中special#character
的#
字符。
上面简单的正则表达式可以匹配到#
array
(
[0] => #
)
当我们给正则表达式加上x
修饰符之后,#
就有了特殊的含义,/#/x
将不再能匹配到任何内容(由于x
的作用,#
到行尾的字符会被忽略,也就是#
有了注释的作用)。 所以在设置了x
的正则中,如果要匹配#
,就要给其加上反斜线/\#/
。
对于这一篇的内容主要是语法的介绍。像上面提到的几个转义的问题是比较重要的,需要在写正则的过程中多加注意。
反斜线(\)
除了上面说的转义特殊字符之外,还有一个相反的功能: 加到某些字符数字前面会有特殊的含义。 具体分三类
一、描述特定的字符类
\d
任意的十进制数字
\d
任意的非十进制数字
foot
)
*/
\h
任意水平空白字符
\h
任意的非水平空白字符
\s
任意空白字符
\s
任意非空白字符
\v
任意垂直空白字符
\v
任意非垂直空白字符
\w
任意单词字符 [a-za-z0-9_]
\w
任意非单词字符 [^a-za-z0-9_]
二、 指定一些简单的断言
\b
单词边界
\b
非单词边界
\a
目标的开始位置(独立于多行模式)
\z
目标的结束位置或结束处的换行符(独立于多行模式)
\z
目标的结束位置(独立于多行模式)
\g
在目标中首次匹配位置
\a
作用就相当于^
,但是和^
不同的是,\a
不受模式修饰符m
的影响,始终匹配的是整个字符串的开始位置,而不是每一行的开始位置。 \z
和\z
作用相当于$
,同样,不同的地方是它们不受m
的影响,也是始终是整个字符串的行尾。 \z
和\z
的不同是如果目标字符串的结尾有换行,\z
会匹配换行符,而\z
不匹配换行,只匹配字符串的结尾。
二者的不同体现在目标字符串结尾是否有换行,如果目标字符串结尾没有换行,那么这二者是没有区别的。
// z
array
(
)
// z
array
(
[0] => 1234
[1] => 1234
)
\g
看起来和\a
、^
的作用差不多,都是匹配首次出现的位置。但是\g
和这两个不同的是,\g
是受函数preg_match
的最后一个参数offset
影响的。 offset
指定在目标字符串开始匹配的位置,\g
是在offset
指定的位置开始匹配的。而\a
还是在整个目标字符串的开始位置,不会受offset
的影响。
$str = "foot1234bar456";
$pattern_g = '/\g(\d )\w*/';
$pattern_a = '/\a(\d )\w*/';
// offset 指定为4 从 1 开始
$res_g = preg_match($pattern_g,$str,$matches_g,0,4);
$res_a = preg_match($pattern_a,$str,$matches_a,0,4);
print_r($matches_g);
print_r($matches_a);
offset指定为4,也就是在1处开始查找。\g就是从位置4——也就是1——处开始匹配;\a不受其影响,还是开始从目标字符串的开始位置匹配,从而匹配不成功。
// \g
array
(
[0] => 1234bar456
[1] => 1234
)
// \a
array
(
)
三、 对非打印字符进行可见编码
此类控制符用的不多,具体可以参考
查看笔记