【PHP常见面试题 PHP基础-正则表达式】至少写出一种验证 139手机号码的正则表达式。

一、考点:

1. 手机号码的正则表达式编写

2. 延伸:正则表达式组成及编写方法

1) 正则表达式的作用:分割、查找、匹配、替换字符串

2)正则表达式的组成部分:

① 分隔符:
1) 正斜线(/)【推荐使用】;
2) hash符号(#);
3) 取反符号(`);
② 通用原子:
1) \d: 0-9
2) \D: 除了0-9

3) \w: 数字、字母、下划线
4) \W: 除了数字、字母、下划线

5) \s: 空白符
6) \S: 除了空白符
③ 元字符:
1) . : 除了 换行符 之外的任意符
2) * : 出现0次、1次或者多次
3)? : 出现0或1次
4) ^ : 必须以其开头
5) $ : 必须以其结尾
6) + : 出现1次或多次
7) {n} : 恰巧出现n次
8) {n,} : >= n次
9) {n, m} : n <= 出现次数 <= m
10) [] : 集合【如:[abc] 表示匹配 a或b或c】
11) ():互相引用,即匹配一个整体【如:(abc) 表示同时匹配abc】
12) [^] : 取反【如:[^abc] 表示除了a/b/c】
13) | : 或者
14) [-] : 匹配一个范围【如:[0-9] 表示匹配0-9】
④ 模式修正符:
1) i : 不区分大小写
2) m : 将字符串通过分隔符进行分割【即将字符串中的每一行分别进行匹配】
3) e : 在进行 preg_replace时,可以将匹配的内容进行PHP语法的处理【PHP7.0起废除】
4) s : 修正圆点元字符(.)和换行
5) U : 取消贪婪模式
6) x : 忽略模式中的空白符
7) A : 必须以该模式开头
8) D : 修正 $对\n的忽略
9) u : 当进行uft-8中文匹配的使用,可以使用

3) 后向引用:将前面匹配到的放到后面

$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>/'; // 正则表达式
preg_replace($pattern, '\\1', $str); // 两个反斜线是为了防止将 \1 转义掉;\1表示匹配第一个括号中的内容;

4) 贪婪模式

取消 贪婪模式 的方法:

① 使用 . * ? 取消贪婪模式

$str = '<b>abc</b><b>bcd</b>'; 
// 匹配每一个<b>标签中的内容
$pattern = '/<b>.*?<\/b>/'; // 匹配到了abc和bcd(从<b>开始,匹配到了abc,遇到</b>结束;再次遇到<b>开始,匹配到了bcd,遇到</b>结束)
preg_replace_all($pattern, '\\1', $str); 

②使用 . * 后面加 U 取消贪婪模式

$str = '<b>abc</b><b>bcd</b>';
$pattern = '/<b>.*</b>/U';

注:不可以同时使用 . * ?U 来取消贪婪;因为 . * ? 代表取消贪婪模式,如果再加一个 U 又变成了贪婪模式,双重否定表肯定。


5) 正在表达式PCRE函数

preg_match();     // 执行匹配正则表达式
preg_match_all(); // 执行一个全局正则表达式匹配
preg_replace();   // 执行一个正则表达式的搜索和替换
preg_split();     // 通过一个正则表达式分隔字符串

6) 中文匹配

① UTF-8汉字编码范围是:0x4e00-0x9fa5; UTF-8要使用 u模式修正符 使模式字符串被当成 UTF-8。
// 该中文为UTF-8下的中文
$str = '中文'; 
// UTF-8进行匹配
$pattern = '/[\x{4e00}-\x{9fa5}]+/u'; // 匹配一次或多次,不区分大小写
preg_match($pattern, $str, $match);
var_dump($match);

运行结果:

在这里插入图片描述

② 在ANSI(gb2312)环境下, 0xb0-0xf7, 0xa1-0xfe;在ANSI(gb2312)环境下,要使用chr将ASCII码转换为字符
$str = '中文';
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/';
preg_match($pattern, $str, $match);
var_dump($match);

运行结果:

在这里插入图片描述

注:由于我的字符集编码是 UTF-8,因此在执行的时候只会匹配到一个 问号


二、解题方法

1) 先写出一个要匹配的字符串;

2) 自左向右的顺序使用正则表达式的原子核元字符进行拼接;

3) 最终加入模式修正符;

4) 不可死记硬背模式;

5) 练习常见正则表达式(URL、Email、IP地址、手机号码等)。


三、真题

1. 至少写出一种验证 139手机号码的正则表达式。

// 13988888888
$str = '13988888888';
$pattern = '/^139\d{8}$/';
preg_match($pattern, $str, $match);
var_dump($match);

运行结果:

在这里插入图片描述

若将字符串中的 9 改为 7,则代码如下:

$str = '13788888888';
$pattern = '/^139\d{8}$/';
preg_match($pattern, $str, $match);
var_dump($match);

运行结果:

在这里插入图片描述


2. 请写出一个正则表达式,取出页面中所有 img标签 中的 src值

$str = '<img alt="狗狗" id="dog" src="dog.jpg" />';
$pattern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($pattern, $str, $match);
var_dump($match);

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/studyphp123/article/details/83515629