php中的转义字符
转义字符语法
转义字符要使用反斜线(\)
来完成。如果反斜线后面跟着一个具有特殊含义的特殊字符(非字母数字)。那么该特殊字符的特殊含义将消失,变成一个普通的字符。例如,如果我们要匹配字符串中的*
,我们知道,*
在正则表达式中是一个量词,是有其特殊用途的,所以可以在正则表达式中写成\*
,这样就成了一个普通的*
字符。
注意:反斜线
(\)
本身也是一个特殊的字符,所以如果我们想要匹配字符串中的反斜线,按照上面的理论需要对正则中的反斜线(\)
进行转义,也就是在它前面再加一个反斜线——(\\)
。然而这是有问题的,我们知道,正则表达式也是一个字符串,不管是单引号还是双引号的字符串,其中的反斜线都有特殊的含义,所以正则中的(\\)
,解析出来之后是/\/
。而正则表达式的引擎收到/\/
之后,认为反斜线(\)
是转义标记,会将分隔符/
转义,因此会得到一个错误。所以说如果想匹配字符串中的反斜线,那正则表达式中要写成四个反斜线(\\\\)
。这样正则表达式引擎收到的是/\\/
,才会去正常匹配。
我们再来举一个典型的例子:匹配目标字符串中special#character
的#
字符。
<?php
$str = "special#character";
$pattern = "/#/"; // 简单书写
$res = preg_match($pattern,$str,$matches);
print_r($matches)
上面简单的正则表达式可以匹配到#
Array
(
[0] => #
)
当我们给正则表达式加上x
修饰符之后,#
就有了特殊的含义,/#/x
将不再能匹配到任何内容(由于x
的作用,#
到行尾的字符会被忽略,也就是#
有了注释的作用)。 所以在设置了x
的正则中,如果要匹配#
,就要给其加上反斜线/\#/
。
对于这一篇的内容主要是语法的介绍。像上面提到的几个转义的问题是比较重要的,需要在写正则的过程中多加注意。
反斜线(\)
除了上面说的转义特殊字符之外,还有一个相反的功能: 加到某些字符数字前面会有特殊的含义。 具体分三类
一、描述特定的字符类
\d
任意的十进制数字
\D
任意的非十进制数字
<?php
$str = "foot1234adsf";
//$pattern = '/(?=(\d+))\w+\1/';
$pattern = '/\D+/x';
$res = preg_match($pattern,$str,$matches);
print_r($matches);
/* 结果
Array
(
[0] => 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
不匹配换行,只匹配字符串的结尾。
<?php
$str = "foot1234\n";
$pattern_z = '/(\d+)\z/';
$pattern_Z = '/(\d+)\Z/';
$res_z = preg_match($pattern_z,$str,$matches_z);
$res_Z = preg_match($pattern_Z,$str,$matches_Z);
print_r($matches_z);
print_r($matches_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
(
)
三、 对非打印字符进行可见编码 此类控制符用的不多,具体可以参考PHP转义字符