📜  PHP | preg_match()函数(1)

📅  最后修改于: 2023-12-03 15:03:39.266000             🧑  作者: Mango

PHP | preg_match()函数

在 PHP 中,preg_match() 函数用于对字符串进行正则表达式匹配,它的语法如下所示:

int preg_match(string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]])

其中,

  • $pattern:需要匹配的正则表达式模式;
  • $subject:需要匹配的字符串;
  • $matches:可选参数,用于存储匹配到的结果;
  • $flags:可选参数,用于指定匹配方式;
  • $offset:可选参数,用于指定匹配字符串的起始位置。
匹配成功与失败

preg_match() 函数会返回匹配到的次数(成功匹配到时为 1,未匹配到时为 0)或者在发生错误时返回 FALSE

$patten = '/abc/';
$subject = 'abcdefg';

$result = preg_match($pattern, $subject);

if ($result) {
  echo '匹配成功';
} else {
  echo '匹配失败';
}

在上面的例子中,匹配到了一次,所以输出结果为“匹配成功”。

匹配到的结果

preg_match() 函数会将匹配到的结果存储到 $matches 数组中。该数组的第 0 个元素存储整个匹配到的字符串,从第 1 个元素开始存储每个子表达式匹配到的结果。

$pattern = '/(ab)c(d)e/';
$subject = 'abcdefg';

preg_match($pattern, $subject, $matches);

print_r($matches);

在上面的例子中,正则表达式 /(ab)c(d)e/ 匹配到字符串 abcdefg 中的 abcde,其中子表达式 (ab)(d) 分别匹配到了 abd。所以,输出结果为:

Array
(
    [0] => abcde
    [1] => ab
    [2] => d
)

需要注意的是,如果出现了多次匹配,$matches 数组只会存储最后一次的匹配结果。

匹配方式

$flags 参数用于指定匹配方式,可选的值有以下几种:

  • PREG_OFFSET_CAPTURE:除了存储匹配到的结果之外,还会记录匹配结果的偏移量;
  • PREG_UNMATCHED_AS_NULL:如果没有匹配上,将 matches 中未匹配到的部分填充为 null ;
  • PREG_PATTERN_ORDER:进行排序,每找到一个匹配项,存储到 matches 中;
  • PREG_SET_ORDER:数组中的每个元素是一个二维数组,其中匹配结果与偏移量都是子数组的元素。

以下是以 PREG_OFFSET_CAPTURE 为例的代码片段:

$pattern = '/abc/';
$subject = 'abcdefg';

preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);

print_r($matches);

输出结果为:

Array
(
    [0] => Array
        (
            [0] => abc
            [1] => 0
        )

)

其中 [0] 存储着匹配结果 abc[1] 则是偏移量,表示起始位置为 0。

指定匹配位置

$offset 参数用于指定匹配字符串的起始位置。例如,在匹配字符串 abcdefg 中的 cd 时,如果从起始位置开始匹配,将匹配到 abcd,而不是 cd。可以通过指定 $offset 参数来解决该问题。

$pattern = '/cd/';
$subject = 'abcdefg';

preg_match($pattern, $subject, $matches, 0, 2);

print_r($matches);

输出结果为:

Array
(
    [0] => cd
)
总结

preg_match() 函数是一个非常强大的正则表达式工具,可以方便地进行字符串匹配和提取。要注意参数的使用方式和匹配结果的存储形式。对于复杂的匹配需求,建议在编写正则表达式时使用在线正则表达式工具来测试效果。