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转义字符