拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

3. PHP 中的正则表达式

3. PHP 中的正则表达式 PHP 中的正则表达式PCREPerl Compatible Regular Expressions是处理字符串的强大工具常用于验证格式如邮箱、手机号、提取内容如从文本中抓链接、替换字符如敏感词过滤等。PHP 提供了专门的函数如preg_match()、preg_replace()来执行正则操作核心语法和通用正则一致但有一些 PHP 特有的规则如定界符、修饰符。一、PHP 正则的基础规则在 PHP 中使用正则必须遵守两个核心规则1. 定界符包裹正则表达式PHP 的正则必须用定界符包裹不能直接写纯正则定界符可以是任意非字母数字的字符常用/、#、~。示例用/作为定界符 →/正则表达式/作用区分正则本身和后续的修饰符见下文避免歧义。2. 修饰符调整匹配规则修饰符放在定界符后面用于改变正则的匹配行为如是否区分大小写。常用修饰符修饰符作用示例i不区分大小写匹配/abc/i会匹配ABC、aBc等g全局匹配默认只匹配一次用preg_match_all()配合/a/g会匹配所有am多行模式^匹配每行开头$匹配每行结尾/^hello/m匹配多行文本中每行的hello开头s单行模式.匹配换行符\n/a.b/s可匹配a\nb默认.不匹配\n二、PHP 正则核心函数PHP 提供了多个正则处理函数最常用的有以下 3 个1.preg_match()检查是否匹配只匹配一次语法preg_match(正则, 目标字符串, 匹配结果数组)作用判断目标字符串是否符合正则模式只返回第一个匹配结果。返回值匹配成功返回1失败返回0错误返回false。示例验证手机号中国大陆 11 位$phone13800138000;// 正则以1开头第二位3-9后面9位数字用/作为定界符$pattern/^1[3-9]\d{9}$/;// 执行匹配结果存到$matches数组if(preg_match($pattern,$phone,$matches)){echo手机号格式正确匹配到.$matches[0];// 输出手机号格式正确匹配到13800138000}else{echo格式错误;}$matches[0]是完整匹配的结果如果正则有分组()$matches[1]、$matches[2]等是分组内容。2.preg_match_all()全局匹配获取所有匹配结果语法preg_match_all(正则, 目标字符串, 匹配结果数组)作用找到目标字符串中所有符合正则的内容结果存到二维数组中。返回值返回完整匹配次数可能是0或者如果发生错误返回FALSE。示例提取文本中所有邮箱$text我的邮箱是atest.com你的是b_123example.cn还有cabcmail.com;// 正则匹配邮箱简化版用#作为定界符避免/转义$pattern#\w([-.]\w)*\w([-.]\w)*\.\w([-.]\w)*#;// 全局匹配所有邮箱preg_match_all($pattern,$text,$matches);// $matches[0] 是所有匹配的邮箱数组print_r($matches[0]);// 输出// Array (// [0] atest.com// [1] b_123example.cn// [2] cabcmail.com// )3.preg_replace()替换匹配的内容语法preg_replace(正则, 替换内容, 目标字符串)作用找到所有符合正则的内容替换为指定字符串。示例过滤敏感词将“bad”替换为“”*$textThis is a bad word, bad idea!;$pattern/bad/i;// i修饰符不区分大小写匹配bad、Bad、BAD等$replacement***;// 替换所有匹配的内容$resultpreg_replace($pattern,$replacement,$text);echo$result;// 输出This is a ***word,*** idea!三、核心元字符与 PHP 示例结合 PHP 函数再巩固下常用元字符的用法重点理解*、、?、()等1.*匹配前面的字符 0 次或多次$strac, abc, abbc;$pattern/ab*c/;// b可以出现0次、1次、多次preg_match_all($pattern,$str,$matches);print_r($matches[0]);// 输出Array ( [0] ac [1] abc [2] abbc )2.匹配前面的字符 1 次或多次$strac, abc, abbc;$pattern/abc/;// b至少出现1次preg_match_all($pattern,$str,$matches);print_r($matches[0]);// 输出Array ( [0] abc [1] abbc )不匹配ac因为b出现0次3.?匹配前面的字符 0 次或 1 次$strcolor, colour;$pattern/colou?r/;// u可以出现0次或1次匹配color或colourpreg_match_all($pattern,$str,$matches);print_r($matches[0]);// 输出Array ( [0] color [1] colour )4.()分组与捕获提取子内容$urlhttps://www.example.com/path?query;// 正则匹配://然后用()捕获域名非/的字符$pattern/:\/\/([^/])/;// ()是分组用于提取域名preg_match($pattern,$url,$matches);echo$matches[0];// 输出://www.example.com完整匹配echo$matches[1];// 输出www.example.com第一个分组的内容即我们要的域名四、实战案例常见场景处理1. 验证邮箱格式严格版functionisEmail($email){// 正则支持字母、数字、下划线、-., 域名支持多级如.co.uk$pattern/^[a-zA-Z0-9_-][a-zA-Z0-9_-](\.[a-zA-Z0-9_-])$/;returnpreg_match($pattern,$email)1;}var_dump(isEmail(testexample.com));// bool(true)var_dump(isEmail(testabcmail.co.uk));// bool(true)var_dump(isEmail(test.com));// bool(false)域名不合法2. 从 HTML 中提取所有图片链接img srcxxx$htmlimg srcpic1.jpgimg srcimages/pic2.png;// 正则匹配img src...捕获引号中的链接用~作为定界符避免/转义$pattern~img src([^])~;preg_match_all($pattern,$html,$matches);print_r($matches[1]);// 输出Array ( [0] pic1.jpg [1] images/pic2.png )3. 格式化手机号中间4位用*代替$phone13800138000;$pattern/(\d{3})(\d{4})(\d{4})/;// 分3组前3位、中间4位、后4位$replacement$1****$3;// $1引用第一组$3引用第三组echopreg_replace($pattern,$replacement,$phone);// 输出138****8000五、注意事项定界符冲突如果正则中包含定界符如/需要转义\/或换其他定界符如#。例匹配http://时用#http://#比/http:\/\//更简洁。性能问题复杂正则尤其是带*、的贪婪匹配在处理长字符串时可能卡顿尽量优化正则如用非贪婪*?。转义字符PHP 字符串中的\需转义为\\例如匹配\d时正则应写为/\\d/因为 PHP 会先解析\为转义。总结PHP 正则的核心是用定界符包裹正则 用专门函数执行操作。掌握preg_match()、preg_match_all()、preg_replace()三个函数结合元字符*、、?、()等和修饰符就能处理大多数字符串场景。多动手测试比如修改上面的示例参数很快就能熟练使用
返回列表