正则表达式简览及PHP相关函数

正则表达式

元字符

元字符说明
*重复零次或多次
+重复一次或多次
?重复零次或一次
{n}重复n次
{n,}重复n次或多次
{n,m}重复n到m次
.匹配除换行符以外的任意一个字符
\w匹配一个字母、数字、下划线
\W匹配一个除字母、数字、下划线以外的字符
\s匹配一个任意的空白符
\S匹配一个不是空白符的任意字符
\d匹配一个数字
\D匹配一个非数字
\b匹配一个单词的开始或结束
\B匹配一个单词的非开始或非结束
^匹配一个字符串的开始
$匹配一个字符串的结束
[][0-9],[a-z],[0-9a-z],[aeiou],[^aeiou]
|
(exp)分组
(?<name>exp)分组命名;若不命名,默认为索引命名
(?:exp)匹配表达式,但不捕获结果
\1或\k<name>反向引用

贪婪懒惰

  • 贪婪:匹配尽可能长的字符串。默认
  • 懒惰(非贪婪):匹配尽可能短的字符串。在重复元字符后面加?可变为非贪婪
贪婪
a.*b

aabab

匹配结果
aabab
----------
懒惰
a.*?b

aabab

匹配结果
aab
ab

零宽断言

一个条件,但不会被实际匹配

  • (?=exp) 正向先行断言
  • (?<=exp) 正向后行断言
  • (?!exp) 负向先行断言
  • (?<!exp) 负向后行断言
正向先行断言
\b\w+(?=ing\b)

I'm singing while you're dancing.

匹配结果
sing
danc
-----------------------------------
正向后行断言
(?<=\bre)\w+\b

reading a book, bbading

匹配结果
ading
-----------------------------------
负向先行断言
\d{3}(?!\d)

123q
1234
123

匹配结果
123
234
123
----------------------------------
负向后行断言
(?<![a-z])\d{7}

AWD3748596dce2846582

匹配结果
3748596

递归

PHP支持(?R) 代表正则表达式本身

https://www.laruence.com/2011/09/30/2179.html

\((?R)*\)
能匹配
((()))

处理选项

选项说明
IgnoreCase匹配时不区分大小写
Multiline以换行为标志看作字符串,$匹配换行符之前的位置
Singleline使.能与每一个字符匹配,包括换行符
IgnorePatternWhitespace忽略表达式中的非转义空白并启用由#标记的注释
  • (?i) IgnoreCase
  • (?m) Multiline
  • (?s) Singleline
  • (?x) IgnorePatternWhitespace

注释

  • (?#comment)
  • #comment ,需开启IgnorePatternWhitespace

PHP正则操作

https://www.php.net/manual/zh/book.pcre.php

分隔符

当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以是任意非字母、数字、反斜线、空白字符。

经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)

preg_match()

执行正则表达式匹配

preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int
  • $pattern:模式,即正则表达式
  • $subject:输入字符串
  • $matches:将被填充为搜索结果。$matches[0]将包含整个模式匹配到的文本,$matches[1]将包含第一个捕获子组匹配到的文本
  • $flags:
    • 0:默认
    • PREG_OFFSET_CAPTURE:保存偏移量。如果传递了这个标记,会改变填充到matches参数的数组,使其每个元素成为一个由第0个元素是匹配到的字符串,第1个元素是该匹配字符串在输入字符串中的偏移量
  • $offset:指定从哪个位置开始搜索

返回值:返回匹配次数。它的值将是0或1或false。preg_match()在第一次匹配后将会停止搜索。如果发生错误会返回false

preg_match_all()

执行全局正则表达式匹配

preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] ) : int
  • $flags:
    • 不能同时使用PREG_PATTERN_ORDER和PREG_SET_ORDER
    • PREG_PATTERN_ORDER:结果排序为$matches[0]保存整个模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推
    • PREG_SET_ORDER:结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组),$matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推
    • PREG_OFFSET_CAPTURE:保存偏移量

返回值:返回匹配次数,如果发生错误返回FALSE

preg_grep()

在数组中搜索匹配模式的元素

preg_grep ( string $pattern , array $input [, int $flags = 0 ] ) : array
  • $input:输入数组
  • $flags:
    • 0:默认
    • PREG_GREP_INVERT:函数将返回输入数组中与给定模式pattern不匹配的元素组成的数组

返回值:返回与模式匹配/不匹配的元素组成的数组,键还是原来的键

preg_replace()

替换

https://www.php.net/manual/zh/function.preg-replace.php

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
  • $pattern:要搜索的模式。可以是一个字符串或数组
  • $subject:输入字符串或数组
  • $replacement:用于替换的字符串或数组
  • $limit:每个模式在每个subject上进行替换的最大次数。默认是 -1(无限)
  • $count:如果指定,将会被填充为完成的替换次数

返回值:返回替换后的字符串或数组,发生错误返回null

preg_filter()

https://www.php.net/manual/zh/function.preg-filter.php

只返回匹配成功的结果,其余同preg_replace()

preg_split()

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

preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) : array
  • $limit:如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制"
  • $flags:
    • PREG_SPLIT_NO_EMPTY:如果这个标记被设置,函数将仅返回分隔后的非空部分
    • PREG_SPLIT_DELIM_CAPTURE:如果设置了此标志,模式中的括号表达式也将被捕获并返回
    • PREG_SPLIT_OFFSET_CAPTURE:附加偏移量

返回值:返回分隔后得到的子串组成的数组,或者在失败时返回FALSE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值