一、PHP正则表达式函数
preg_match — 执行一个正则表达式匹配
preg_match ( $pattern , $subject , $matches )
搜索subject与pattern给定的正则表达式的一个匹配.
参数 :
pattern : 要搜索的模式,字符串类型(正则表达式)。
subject : 输入的字符串。
matches :(可有可无)如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
返回值 :
preg_match()返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。
preg_replace()
preg_filter() //执行一个正则表达式的搜索和替换
二、正则表达式
1、在PHP中定界符
定界符表示一个正则表达式的开始和结束
/ / /[0-9]/
# # #[0-9]#
{ } {[0-9]}
2、原子
最小的匹配单位,Unicode编码表键盘输出后的字符abcd#$%等为可见原子,回车、制表符等为不可见原子
3、元字符
1)原子的筛选方式
| 匹配两个或者多个分支选择
[ ] 匹配方括号中的任意一个原子
[ ^ ] 匹配方括号中的原子之外的任意字符 ^ 必须跟左括号紧连
2)原子的集合
. 匹配除换行符之外的任意字符
注意以下匹配的是一个
\d 匹配任意一个十进制数字 即[0-9]
\D 匹配任意一个非十进制数字,即 [^0-9]
\s 匹配一个不可见原子 ,即 [\f\n\t\r\v]
\S 匹配一个可见原子,即 [^\f\n\r\t\v]
\w 匹配任意一个数字、字母或下划线,即 [0-9a-zA-Z]
\W 匹配任意一个非数字、字母或下划线即 [^0-9a-zA-Z]
\. 其中\ 表示转义 .就是表示. 不代表除换行符之外的任意字符
4、量词
{n} 表示其前面的原子恰好出现n次 // \d{2} 数字刚好出现两次,只要是数字且刚好出现两次则匹配
{n,} 表示其前面的原子最少出现n次
{n,m} 表示其前面的原子最少出现n次,最多出现m次
* 匹配0次、1次或者多次其之前的原子,即 {0,}
? 匹配0次或者1次其之前的原子,即 {0,1}
+ 匹配1次或者多次其之前的原子即{1,}
5、边界控制
\b 匹配单词的开始和结尾(边界)
\B 匹配单词的非边界
^ 匹配字符串开始的位置 其后字符串为一个整体,不管要匹配的有换行符还是空格要匹配的字符串等都为一个整体,一个整体开始位置只能有一个,
$ 匹配字符串结尾的位置
( ) 匹配其中的整体为一个原子 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
1)注意: \b 和 ^ 区别
^的意思是以其后的字符为开始
\b的意思是该字符的前或者后为空格或者标点
举例来说 ^abc 和\babc 如字串“abcd” 和字串"James abc" "James,abc" 匹配结果如下
匹配
abcd
james abc
abc
\ba //表示匹配单词a 开头或结尾的 可以匹配3处
abcd
james abc
abc
^a //匹配a开始的字符串开始的位置只有第一行字符串a开始的位置,
abcd
james abc
abc
2)注意反向引用
参考 https://blog.csdn.net/z69183787/article/details/52263988
$str = "txt hello, high, bom , mum";
//第n个小括号内的子表达式,命中的内容,后面用 \n来引用
//后向引用
$patt = '/\b([a-z])\w+\1\b/'; //两种情况nginx 用 $1 、php 用 \1
preg_match_all($patt, $str, $arr);
echo "
";print_r($arr);
3)反-向引用 https://blog.csdn.net/lxcnn/article/details/4146148
捕获组:
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。
反向引用:
捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。引用就是该内容再次匹配
//两种情况nginx 用 $1 、php 用 \1
php 反向引用实例,只能在正则函数内部识别,不能在外部当做变量识别
$string = "Is is the cost of of gasoline going up up";
$pattern = "/\b([a-z]+) \\1\b/i"; //这里的\\1(\\1 为了转义\)不能使用\$1或$1
$str = preg_replace($pattern, "\\1", $string); //这里的\\1可以使用\$1或$1,引用第一个子匹配
echo $str; //效果是Is the cost of gasoline going up
?>
6、修正模式
1)贪婪匹配
匹配结果存在歧义时取其长
2)懒惰模式
匹配结果存在歧义的取其短 // 在其定界符后面加U ,即为懒惰模式,默认情况下为贪婪模式如下
匹配到的为 imooc_123
3)常见的修正模式,修正模式对于规则而言,
U /u 懒惰匹配/ 贪婪匹配
i 忽略英文大小写
x 忽略空白 // 规则 忽略空白 "/mo ke.+123/x" 忽略规则中的空白
s 让元字符 . 匹配包括换行符在内的所有字符
实例:
1、保留两位小数的浮点数
\d+\.\d{2}$ // \. 为转义字符将.转义
2、匹配手机号
1(3|4|5|7|8)\d{9}
3、email
^\w+(\.\w+)*@\w+(\.\w+)+$/
7、正则表达式 预搜索(零宽断言)详解(精)
https://blog.csdn.net/xiaokui_wingfly/article/details/51984087