目录
背景
正文
总结
今天在学习正则表达式,遇到了一个问题,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有点奇怪,如果五个反斜杠报错是正常的情况,那么三个反斜杠报错应该就是反常的情况了,那为啥三个反斜杠就不会报错,而且正常匹配出来了呢???
目前还没想到为啥会出现这种情况,不知道有没有哪个大神愿意给小生讲一下
每天进步一小点,不断积累——致自己