PHP

PHP正则表达式

PHP regular expression

Posted by Lv Hui on June 5, 2014

元子符(原子)

  • \d 匹配任意一个数字 //[0-9]
  • \D 匹配任意一个非数字 //[^0-9]
  • \w 匹配任意数字,字母,或下划线 //[0-9a-zA-z_]
  • \W 匹配任意一个非数字,字母,下划线 //[^0-9a-zA-z_]
  • \s 匹配任意空白字符 //[\n\f\r\t\v]
  • \S 匹配任意非空白字符 //[^\n\f\r\t\v]
  • \n 换行符
  • \t 制表符

元字符表(原子表)

  • . 表示除换行符外任意字符
  • [\da] 方括号元字符表,匹配元字符表里的任意字符则表示正则通过

元字符组(原子组)

若一次匹配多个原子,则需要用到原子组。和原子表的区别在于,原子表一次只能匹配 一个字符,而原子组可以匹配多个

1
2
3
$preg=/(amazon|google)/;  //其中`|`表示选择修饰符,其中一个符合就通过
$str='amazon.com';
$new =preg_replace($preg,'coolerk',$str);

重复匹配

  • * 重复零次或更多次
  • + 重复一次或更多次
  • ? 重复零次或一次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次

禁止贪婪

正则表达式默认匹配更多的字符,需要用?禁止贪婪模式,这样将会匹配尽量少的字符

匹配字符边界

  • ^匹配字符串的开始
  • $匹配字符串结束,忽略换行符

模式修正符

  • i不区分大小写
  • s将字符串视为单行,使.可以匹配任意字符
  • e将替换的字符作为表达式使用
1
2
3
4
preg = '/密码是(\d+?)/e'; 
$str = "密码是123456";
$re = preg_replace($preg,'md5(\1)',$str); //`\1`表示被替换的原字符,表示在`md5()`括号中的内容
p($re);

常用的正则操作函数

preg_match

根据正则规则,匹配字符串中是否有所找的字符,成功匹配返回true

1
preg_match('正则规则','需要匹配的字符串');

preg_match_all

将成功匹配到的所有字符以数组的形式存在$match中,规则中如果用了原子组,匹配到的 原子组里的字符串会被整理成一个数组存在$match中,即$match[1]

1
preg_match_all('规则','需要匹配的字符串',$match); 

preg_split

通过一个正则表达式,分割字符串

1
2
3
4
$preg = '/[@#]/';
$str = "12.jpg@333.gif#55555.png#1111.bmp";
$re = preg_split($preg,$str);
p($re);

preg_replace

执行一个正则表达式的搜索和替换

1
preg_replace('规则','替换内容','需要匹配的字符串');

preg_replace_callback

执行一个正则表达式搜索并且使用一个回调函数替换

1
2
3
4
5
6
7
8
9
$str = '666';
$preg = '/\d/';
//用preg去匹配str里的内容,每个被匹配到的内容都会调用foo函数,foo函数的返回值会
将当前匹配到的内容替换掉
$result = preg_replace_callback($preg,'foo',$str);
p($result);
function foo($x){
    return '*';
//    return $x[0]+1;