教程 > php-正则 > 阅读:37

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
(
)

三、 对非打印字符进行可见编码 此类控制符用的不多,具体可以参考

查看笔记

扫码一下
查看教程更方便
网站地图