正则 环视(零宽断言)
环视不匹配任何字符,只匹配文本中的特定位置。类似于\b,^,$那样。环视不会占用字符。
环视分为顺序和逆序两种。
顺序
(?=exp)位置的后面能匹配exp。例如(?=\d)当前位置右边是数字
(?!exp)位置的后面不能匹配exp。例如(?!\d)当前位置右边不是数字
逆序
(?<=exp)位置的前面能匹配exp。例如(?<=\d)当前位置左边是数字
(?<!exp)位置的前面不能匹配exp。例如(?<!\d)当前位置左边不是数字
(?=jeffrey)jeff 等价于 jeff(?rey)

例子
<?php
$string = '5345678986';
$pattern = '/(?!=\d)(?=(\d{3})+$)/';
$replacement = ',';
echo preg_replace($pattern, $replacement, $string);//5,345,678,986

贪婪与懒惰
贪婪 通常的行为是匹配尽可能多的字符
a.b -- aabab -- 会匹配 aabab
懒惰 只要在后面加上一个问号?。这样.? 就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
a.*?b --- aabab -- 会匹配 aab和 ab
正则的引擎
是否支持忽略优先量词和分组捕获
支持的话是 NFA
不支持的话是 DFA
DFA文本主导 // awk,egrep,flex,lex,msyql,procmail
NFA表达式主导 // gnu,emacs,java,ergp,less,more,.net,perl,php,python,ruby,sed,vi

php pcre的主要函数
preg_grep -------------- 返回匹配模式的数组条目
preg_match -------------- 执行一个正则表达式匹配
preg_match_all -------------- 执行一个全局正则表达式匹配
preg_filter -------------- 执行一个正则表达式搜索和替换
preg_replace -------------- 执行一个正则表达式的搜索和替换
preg_replace_callback --------------执行搜索并且使用一个回调进行替换
preg_split-------------- 通过一个正则表达式分隔字符串
preg_quote -------------- 转义正则表达式字符
preg_last_error-------------- 返回最后一个pcre正则执行产生的错误代码