【PHP】之4个反斜杠、3个反斜杠的情况

背景:

今天在学习正则表达式,遇到了一个问题,php中4个反斜杠\在不同解释器中的结果。

正文:

我们先来看看以下代码

echo '\';

运行之后报语法错误,提示unexpected'\'; ',即\'; 这几个字符出了问题

Parse error: syntax error, unexpected ''\'; ' (T_ENCAPSED_AND_WHITESPACE) in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 10

我的理解是,php解释器在读代码的时候,发现了第一个反斜杠,会连同后面的';也一起解释成转义字符,因此少了代表结尾的'以及;

报这个错也理所当然。

接着我们改成以下代码

echo '\\';

运行之后成功输出一个\

\

接着继续改动我们的代码

echo '\\\';

报错,原因同第一个错

Parse error: syntax error, unexpected ''\\\'; ' (T_ENCAPSED_AND_WHITESPACE) in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 10

接下来继续改动

echo '\\\\';

运行之后

\\

经过上面的测试,可能跟你想的一样,如果要让php解释器解释出一个反斜杠,就需要使用\\;如果需要php解释器解释成两个反斜杠,则使用\\\\

下面来讨论一下正则解释器的情况。

正常情况下,如果我们要用正则来匹配是否有反斜杠,会这么写

$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\/';

$result = preg_match($pattern,$content);
echo $result;

但结果是

Warning: preg_match(): No ending delimiter '/' found in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 13

很明显报错了,原因很简单,php解释器在看到$pattern的时候,会把$pattern解释成/\/,然而preg_match中的第一个参数需要有一对任何非字母、数字、“\”或空格的字符作为分隔符,也就是我们最常用的“/”,所以php报了一个没有结束分隔符的错。

代码改进

$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\\\/';

$result = preg_match($pattern,$content);
echo $result;

将两个反斜杠变成四个反斜杠,$pattern被php解释为/\\/,再由正则解释器解释为\,即匹配一个\

输出$result

1

总结:

如果要让正则匹配出一个\字符,则需要在php中的pattern中添加四个\字符,经过php解释器解释成两个\字符,再有正则解释器解释成一个字符\

PS:

遇到了一个比较反常的情况,大家感兴趣的可以一起讨论一下,也可以选择跳过

如果代码变成一个反斜杠的情况

$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\/';

$result = preg_match($pattern,$content);
echo $result;

意料之中的报错了

Warning: preg_match(): No ending delimiter '/' found in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 13

没有结尾分隔符,原因上文中有

继续改,变成三个反斜杠

$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\\/';

$result = preg_match($pattern,$content);
echo $result;

结果为1,没有报错

1

echo 一下$pattern,结果如下

/\\/

也就是说,三个反斜杠的情况,php成功解释成两个反斜杠的情况,而且正则也成功匹配出了一个反斜杠

继续改,变成五个反斜杠

$content = 'Aha! Can you type backslash characters? Yeah! Here is a \ ';
$pattern = '/\\\\\/';

$result = preg_match($pattern,$content);
echo $result;

报错了

Warning: preg_match(): No ending delimiter '/' found in D:\phpStudy\PHPTutorial\WWW\phpStudy\12_4backslash\1.php on line 13

没有结束分隔符的错误

emmmmm有点奇怪,如果五个反斜杠报错是正常的情况,那么三个反斜杠报错应该就是反常的情况了,那为啥三个反斜杠就不会报错,而且正常匹配出来了呢???

目前还没想到为啥会出现这种情况,不知道有没有哪个大神愿意给小生讲一下

每天进步一小点,不断积累——致自己

猜你喜欢

转载自blog.csdn.net/weixin_41463193/article/details/83539168