php 涉及反斜杠\的正则 \a

已经理解这些:
1、php正则分两步:(1)解析字符串 (2)正则解析
2、\\\和\\\\ 最后就是 一个普通字符\
等等...

下面两个和我理解的一样 最后就是匹配一个普通字符串\a

preg_match('/\\\a/', 'a');
preg_match('/\\\\a/', 'a');

疑问:下面这两个为什么不能匹配 普通字符 a ??

preg_match('/\a/', 'a');
preg_match('/\\a/', 'a');

网上的正则图解 也是这样...
clipboard.png

麻烦解答一下~~
谢谢~~

原提问忘记在正则字符串增加定界符/.../了,修改了一下
自己本地测试是有的,提问的时候忘记加了,其它都没变,继续等待解答~~

阅读 4.2k
4 个回答

单引号不会对其中的内容做转义处理


<?php
var_dump(preg_match('/\a/', '\a', $matches)); // int(0)
var_dump($matches); // array()
// Pattern ======= 正则引擎收到的输入
//  \a     ------- \a

var_dump(preg_match('/\a/', "\07", $matches)); // int(1)
var_dump($matches); // array('[响铃字符]')
// Pattern ======= 正则引擎收到的输入
//  \a     ------- \a

var_dump(preg_match('/\\\a/', '\a', $matches)); // int(1)
var_dump($matches); // array('\a')
// Pattern ======= 正则引擎收到的输入
//  \\\a   ------- \\a

var_dump(preg_match('/\\a/', 'a', $matches)); // int(0)
var_dump($matches); // array()
// Pattern ======= 正则引擎收到的输入
//  \a     ------- \a

var_dump(preg_match('/\\a/', "\07", $matches)); // int(1)
var_dump($matches); // array('[响铃字符]')
// Pattern ======= 正则引擎收到的输入
//  \a     ------- \a

var_dump(preg_match('/\\\\a/', '\a', $matches)); // int(1)
var_dump($matches); // array('\a')
// Pattern ======= 正则引擎收到的输入
//  \\\\a   ------- \\a

var_dump(preg_match('/\a/', '\a', $matches)); // int(0)
var_dump($matches); // array()
// Pattern ======= 正则引擎收到的输入
//  \a     ------- \a

总结(单引号)

  1. 对于单引号内的单个\并不会转义之后的字符(\\除外)
  2. 为什么'/\a/'匹配不到字符\a, 因为正则引擎收到\a被转换成了\07的鸣笛字符 Escape sequences

为什么是四条\\a呢?因为\a不会被转义,\\a转义之后刚好是\a

匹配'\' 用'\\\\'

clipboard.png

clipboard.png
气人。

clipboard.png
莫名奇妙。

clipboard.png
interesting.
你运气好,正好用‘a’来测试。

匹配单个放中括号里好了preg_match('/[a]/', 'a')

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题