教程 > PHP-正则 > 特殊字符 阅读:31

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

查看笔记

扫码一下
查看教程更方便