- 匹配一次或多次 +
- 匹配零次或多次 *
- \? 匹配0次或1次
- {n} 匹配n次
- {n,m} 匹配n到m次
- {n,} 匹配大于n次
$patt = `/[a-zA-Z]/{5}`
$arr = 'gooood good gooood goooooooooooooood';
$patt = '/go+d/';
print_r(preg_replace($patt,'god','$arr));
result:
god god god god
$str = 'goood good gooood goooooooooooooood';
$patt = '/\b\w{5}\b/';
preg_match($patt,$str,$res);
echo $res;
注:单词前后的\ b代表单词的开头结尾识别符。原来会遗漏掉这个用法
result
goood
example:找出纯数字或字母的
$arr = 'hello g34g 333 aaaa';
$patt = '/\b[a-zA-Z]+\b |\b[\d]+\b /';
preg_match_all($patt,$arr,$res);
print_f($res);
result:
333 aaa hello
贪婪模式案例
$arr = 'adfa good gsdfsdfsdfsd gsdfsdf goooood 898 gd123';
$patt = '/g.*d/';
preg_match_all($patt,$arr,$res);
print_f($res);
result:
.*含括出了 g和d中间的所有匹配
good gsdfsdfsdfsd gsdfsdf goooood 898 gd
非贪婪模式案例
$arr = 'adfa good gsdfsdfsdfsd gsdfsdf goooood 898 gd123';
$patt = '/g.*?d/';
preg_match_all($patt,$arr,$res);
print_r($res);
和贪婪只有一个?的差异,我用中文字符,以示区别。
result:
Array ( [0] => Array ( [0] => good [1] => gsd [2] => gsd [3] => goooood [4] => gd ) )
案例说明总结:
非贪婪模式
找到一个从g往后找d,如果找到了直接输出,然后继续找。
贪婪模式
找一个g往后找d,找到了一个d,继续往后找,直到最后一个d,然后输出
排除后向引用找收尾一致的单词会很麻烦 类似
// 只能找a首位一致的
$patt = '/\ba\w+a\b/';
引入后向引用概念:
第n个子括号内的子表达式后面用\n 来表示 (其他语言可能是$n)。
可以参考以下代码
$patt = '/\b(\w+).*\1\b/';
参考案例,查找首尾字母一致的单词
$str = 'massdm AsdfsdZA sdfsfs sdfsdfss1 sdf ';
$patt = '/\b([a-zA-Z]\w*\1\b)/';
preg_match_all($patt,$str,$res);
print_r($res);
再做个案例,替换手机号中间4位数
$str = '18760581322 18760581321 1876058132211';
$patt = '/\b(\d{3})\d{4}(\d{4})\b/';
echo preg_replace($patt,'\1****\2',$str);
单行模式:
把整个文件当成一行,表达式末尾加上 \s
$patt = '/\b[a-z]*/s'
不区分大小写 ,表达式末尾加上 \i
$patt = '/\b[a-z]*/i'
example:
$str = 'I Missing U Alicelock';
//$patt = '/\b[a-z]\b/';
$patt = '/\b[a-z]*\b/i';
preg_match_all($patt,$str,$res);
var_dump('$res');
result
// arr();
array(1) { [0]=> array(8) { [0]=> string(1) "I" [1]=> string(0) "" [2]=> string(7) "Missing" [3]=> string(0) "" [4]=> string(1) "U" [5]=> string(0) "" [6]=> string(9) "Alicelock" [7]=> string(0) "" } }
判断中文
把传入的字符集当做unicode编码,可以判断中文模式,
表达式尾加入 \u
未完待更….