【PHP面试题】正则表达式及手机号码的正则表达式。


一、考点:

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

4) 贪婪模式

$str = '&#60b&#62abc&#60/b&#62&#60b&#62bcd&#60/b&#62'; 
$pattern = '/&#60b&#62(.*)&#60\/b&#62/'; // 贪婪模式
echo preg_replace($pattern, '\\1', $str);  // abc&#60/b&#62&#60b&#62bcd

取消 贪婪模式 的方法:
① 使用 . * ? 取消贪婪模式

$str = '&#60b&#62abc&#60/b&#62&#60b&#62bcd&#60/b&#62'; 
// 匹配每一个&#60b&#62标签中的内容
$pattern = '/&#60b&#62(.*?)&#60\/b&#62/'; // 匹配到了abc和bcd(从[b]开始,匹配到了abc,遇到[/b]结束;再次遇到[b]开始,匹配到了bcd,遇到[/b]结束)
echo preg_replace($pattern, '\\1'."\n", $str); 
// abc
// bcd

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

$str = '&#60b&#62abc&#60/b&#62&#60b&#62bcd&#60/b&#62';
$pattern = '/&#60b&#62(.*)&#60\/b&#62/U';
echo preg_replace($pattern, '\\1'."\n", $str); 
// abc
// bcd

两种方法不能同时使用

5) 正在表达式PCRE函数

函数描述
preg_filter 执行一个正则表达式搜索和替换
preg_grep 返回匹配模式的数组条目
preg_last_error 返回最后一个PCRE正则执行产生的错误代码
preg_match_all 执行一个全局正则表达式匹配
preg_match 执行一个正则表达式匹配
preg_quote 转义正则表达式字符
preg_replace_callback_array 执行一个正则表达式搜索并且使用一个回调进行替换
preg_replace_callback 执行一个正则表达式搜索并且使用一个回调进行替换
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);
/* array(1) {
  [0]=>
  string(6) "中文"
}
*/

② 在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);

二、解题方法

1) 先写出一个要匹配的字符串;
2) 自左向右的顺序使用正则表达式的原子核元字符进行拼接;
3) 最终加入模式修正符;
4) 不可死记硬背模式;
5) 练习常见正则表达式(URL、Email、IP地址、手机号码等)。

三、真题

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

$str = '13988888888';
$pattern = '/^139\d{8}$/';
preg_match($pattern, $str, $match);
var_dump($match);
/*
array(1) {
  [0]=>
  string(11) "13988888888"
}
*/

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

$str = '&#60img alt="狗狗" id="dog" src="dog.jpg" /&#62';
$pattern = '/&#60img.*?src="(.*?)".*?\/?&#62/i';
preg_match($pattern, $str, $match);
var_dump($match);
/*
array(2) {
  [0]=>
  string(43) "&#60img alt="狗狗" id="dog" src="dog.jpg" /&#62"
  [1]=>
  string(7) "dog.jpg"
}
*/

文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
 上一篇
【PHP面试题】不断在文件 hello.txt 头部写入一行 "Hello World" 字符串,要求代码完整。 【PHP面试题】不断在文件 hello.txt 头部写入一行 "Hello World" 字符串,要求代码完整。
一、考点1、文件读取/写入操作文件系统相关函数 1) 文件打开 fopen()函数:用来打开一个文件,打开时需要指定打开模式 打开模式: r : 只读方式打开,并且将文件指针指向文件的开头 r+ :读写方式打开,并且将文件指针指向文件的
2020-07-08
下一篇 
PHP 自定义函数及内部函数考察点 PHP 自定义函数及内部函数考察点
一、变量的作用域 变量的作用域也称变量的范围,变量的范围即它定义的上下文背景(也是它的生效范围)。大部分的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。 任何用于函数内部的变量
2020-07-06
  目录