php 正则表达式

一、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

你可能感兴趣的:(php)