PHP语法基础篇(九):正则表达式
正则表达式在开发中是会经常使用到的,最常见的就是对数据进行有效性验证。比如:身份证号码有效性验证、手机号码有效性验证等。本篇文章将记录在PHP中使用正则表达式的学习过程。
一、什么是正则表达式?
正则表达式,它是一种文本模式,同时也是计算机科学的一个概念,其中包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
语法
在 PHP 中,正则表达式是由分隔符、模式和可选修饰符组成的字符串。
$exp = "/test/i";
在上面的例子中,/ 是分隔符,test 是要搜索的模式,i 是一个修饰符,它使搜索不区分大小写。
分隔符可以是任何非字母、非数字、非反斜杠和非空格的字符。最常见的分隔符是正斜杠(/),但当您的模式包含正斜杠时,选择其他分隔符(如 # 或 ~)会更方便。
二、正则表达式函数
PHP 提供了多种使用正则表达式的函数,最常见的函数包括:
函数 | 描述 |
preg_match() | 如果字符串中存在与模式匹配的项,则返回 1,否则返回 0。 |
preg_match_all() | 返回字符串中与模式匹配的项的次数,次数也可能是 0。 |
preg_replace() | 返回新字符串,其中匹配的模式已被另一个字符串替换。 |
1、preg_match()
preg_match:执行匹配正则表达式。
说明
preg_match(string $pattern,string $subject,array &$matches = null,int $flags = 0,int $offset = 0
): int|false
参数
pattern(必需) | 要搜索的模式,字符串类型。 |
subject(必需) | 输入字符串。 |
matches(可选) | 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。 |
flags(可选) | flags 可以被设置为以下标记值的组合: PREG_OFFSET_CAPTURE 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的字节数)。注意:这会改变填充到matches参数的数组,使其每个元素成为一个由第0个元素是匹配到的字符串,第1个元素是该匹配字符串在目标字符串subject中的偏移量。 PREG_UNMATCHED_AS_NULL 使用该标记,未匹配的子组会报告为 null;未使用时,报告为空的 string。 |
offset(可选) | 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于指定从目标字符串的某个位置开始搜索(单位是字节)。 |
返回值
如果 pattern 匹配到指定 subject,则 preg_match() 返回 1,如果没有匹配到则返回 0, 或者在失败时返回 false。
示例
$str = "TESTabc123";
$exp = "/test/i";
echo preg_match($exp, $str); // 输出 "1"
2、preg_match_all()
preg_match_all:执行一个全局正则表达式匹配。
说明
preg_match_all(string $pattern,string $subject,array &$matches = null,int $flags = 0,int $offset = 0
): int|false
搜索 subject 中所有匹配 pattern 给定正则表达式的匹配结果并且将它们以 flag 指定顺序输出到 matches 中,在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索。
参数
pattern(必需) | 要搜索的模式,字符串形式。 |
subject(必需) | 输入字符串。 |
matches(可选) | 多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。 |
flags(可选) | 可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER): PREG_PATTERN_ORDER 结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。 PREG_SET_ORDER 结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组), $matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。 PREG_OFFSET_CAPTURE 如果这个标记被传递,每个发现的匹配返回时会增加它相对目标字符串的字节偏移量。注意这会改变matches中的每一个匹配结果字符串元素,使其成为一个第0个元素为匹配结果字符串,第1个元素为匹配结果字符串在subject中的偏移量。 PREG_UNMATCHED_AS_NULL 传入此标记,未匹配的子组报告为 null;否则会是空 string。 如果没有给定排序标记,默认为PREG_PATTERN_ORDER。 |
offset(可选) | 通常, 查找时从目标字符串的开始位置开始。可选参数offset用于从目标字符串中指定位置开始搜索(单位是字节)。 |
返回值
返回完整匹配次数(可能是 0), 或者在失败时返回 false。
示例
$str = "This is an apple.";
$exp = "/is/i";
echo preg_match_all($exp, $str); // 输出 "2"
3、preg_replace()
preg_replace:执行一个正则表达式的搜索和替换。
说明
preg_replace(string|array $pattern,string|array $replacement,string|array $subject,int $limit = -1,int &$count = null
): string|array|null
搜索 subject 中匹配 pattern 的部分,以 replacement 进行替换。
参数
pattern(必需) | 要搜索的模式。可以是一个字符串或字符串数组。 |
replacement(必需) | 用于替换的字符串或字符串数组。如果这个参数是一个字符串,并且 pattern 是一个数组,那么所有的模式都使用这个字符串进行替换。如果 pattern 和 replacement 都是数组,每个 pattern 使用 replacement 中对应的元素进行替换。如果 replacement 中的元素比 pattern 中的少,多出来的 pattern 使用空字符串进行替换。 |
subject(必需) | 要进行搜索和替换的字符串或字符串数组。 如果 subject 是一个数组,搜索和替换回在 subject 的每一个元素上进行, 并且返回值也会是一个数组。 如果 subject 是关联数组,则键会保留在返回值中。 |
limit(可选) | 每个模式在每个 subject 上进行替换的最大次数。默认是 -1(无限)。 |
count(可选) | 如果指定,将会被填充为完成的替换次数。 |
返回值
如果 subject 是一个数组,preg_replace() 返回一个数组,其他情况下返回一个字符串。
如果匹配被查找到,替换后的 subject 被返回,其他情况下返回没有改变的 subject。如果发生错误,返回 null 。
示例 使用不区分大小写的正则表达式将字符串中的 "apple" 替换为 "orange":
$str = "This is an apple.";
$exp = "/apple/i";
echo preg_replace($exp, "orange", $str); // 输出 "This is an orange."
三、正则表达式修饰符
修饰符可以改变搜索的执行方式。
修饰符 | 描述 |
i | 执行不区分大小写的搜索。 |
m | 执行多行搜索(在字符串的开头或结尾搜索匹配项的模式现在将匹配每行的开头或结尾)。 |
u | 启用 UTF-8 编码模式的正确匹配。 |
四、正则表达式模式
使用方括号来查找一系列字符:
表达式 | 描述 |
[abc] | 查找方括号内的一个或多个字符。 |
[^abc] | 查找不在方括号内的任何字符。 |
[a-z] | 查找两个字母之间的任何字母字符。 |
[A-z] | 查找指定大写字母和指定小写字母之间的任何字符。 |
[A-Z] | 查找两个大写字母之间的任何字符。 |
[123] | 查找方括号内的一个或多个数字。 |
[0-5] | 查找两个数字之间的任何数字。 |
[0-9] | 查找任何数字。 |
五、元字符
元字符是具有特殊含义的字符:
元字符 | 描述 |
| | 查找由 | 分隔的任何模式之一,如:cat|dog|fish。 |
. | 查找任何字符。 |
^ | 查找作为字符串开头的匹配项,如:^Hello。 |
$ | 查找作为字符串结尾的匹配项,如:World$。 |
\d | 查找任何数字。 |
\D | 查找任何非数字。 |
\s | 查找任何空白字符。 |
\S | 查找任何非空白字符。 |
\w | 查找任何字母(a 到 Z)和数字(0 到 9)。 |
\W | 查找任何非字母和非数字字符。 |
\b | 查找位于单词开头或结尾的匹配项,如:\bWORD 或 WORD\b。 |
\uxxxx | 查找由十六进制数 xxxx 指定的 Unicode 字符。 |
六、量词
量词定义数量:
量词 | 描述 |
n+ | 匹配包含至少一个 n 的任何字符串。 |
n* | 匹配包含零个或多个 n 的任何字符串。 |
n? | 匹配包含零个或一个 n 的任何字符串。 |
n{3} | 匹配包含三个 n 的序列的任何字符串。 |
n{2, 5} | 匹配包含至少 2 个但不超过 5 个 n 的序列的任何字符串。 |
n{3,} | 匹配包含至少 3 个 n 的序列的任何字符串。 |
注意:如果表达式需要搜索特殊字符之一,可以使用反斜杠(\)来转义它们。例如,要搜索一个或多个问号,可以使用以下表达式:$pattern = '/\?+/';。
七、分组
可以使用括号 ( ) 将量词应用于整个模式。它们还可以用于选择模式的一部分作为匹配项。
示例 使用分组通过查找 ba 后跟两个 na 实例来搜索单词 "banana":
$str = "This is a banana.";
$exp = "/ba(na){2}/i";
echo preg_match($exp, $str); // 输出 "1"