PHP正则

94 阅读2分钟

正则

preg_match

根据正则表达式对字符串进行搜索匹配,在第一次匹配成功后结束

preg_match (string $pattern, string $subject, &$matches, int $flags = 0, int $offset = 0): int|false
  • $pattern:正则表达式
  • $subject:搜索字符串
  • $matches:可选参数(数组类型),如果提供了 $matches,它将被填充为搜索结果

$matches[0] 包含完整模式匹配到的文本, $matches[1] 包含第一个捕获子组匹配到的文本,以此类推

  • $flags:可选参数,$flags可以被设置为PREG_OFFSET_CAPTURE,如果传递了这个标记,对于每一个出现的匹配,返回时都会附加上字符串偏移量(相对于目标字符串的)
  • $offset:可选参数,用于指定从目标字符串的哪个位置开始搜索(单位是字节)

该函数返回匹配的次数,为0或1,匹配不成功返回0,匹配成功返回1并结束匹配

$name = 'abcdef';
preg_match('/^a/', $name, $match, PREG_OFFSET_CAPTURE);
print_r($match);
Array ( 
    [0] => Array ( 
    	[0] => a [1] => 0 
    ) 
)

preg_match_all

pren_match类似,但是是搜索字符串中所有可以和正则表达式匹配的结果

preg_match_all (string $pattern, string $subject, &$matches, int $flags = PREG_PATTERN_ORDER, int $offset = 0): int|false|null
$name = 'abcabc';
preg_match_all('/ab./', $name, $match, PREG_OFFSET_CAPTURE);
print_r($match);
Array ( 
	[0] => Array ( 
		[0] => Array ( [0] => abc [1] => 0 ) 
		[1] => Array ( [0] => abc [1] => 3 ) 
	) 
)

preg_grep

对数组中元素进行匹配

function preg_grep (string $pattern, array $array, int $flags = 0): array|false
  • $pattern:正则表达式
  • $input:搜索数组
  • $flags:可选参数,可以设置为PREG_GREP_INVERT,这时函数会返回数组中与给定模式$pattern不匹配的元素组成的数组

$a = [
    "aaa",
    "bbb",
    "abc"
];

$result = preg_grep('/^a/', $a);
print_r($result);
Array ( [0] => aaa [2] => abc )

preg_replace

搜索 subject 中匹配 pattern 的部分,以 replacement 进行替换

preg_replace (array|string $pattern, array|string $replacement, array|string $subject, int $limit = -1, &$count): array|string|null
  • $pattern:正则表达式
  • $replacement:用于替换的字符串或字符串数组

如果这个参数是一个字符串,并且 $pattern是一个数组,那么所有的模式都使用这个字符串进行替换

如果$pattern$replacement都是数组,每个$pattern使用$replacement中对应的元素进行替换

如果$replacement中的元素比$pattern中的少,多出来的$pattern使用空字符串进行替换。

  • $subject:要进行搜索和替换的字符串或字符串数组,如果$subject是一个数组,搜索和替换回在$subject的每一个元素上进行,并且返回值也会是一个数组
  • $limit:可选参数,每个模式在每个$subject上进行替换的最大次数;默认是 -1(无限)
  • $count:可选参数,如果指定,将会被填充为完成的替换次数

$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/';
$replacement = '$1-$2-$3';
echo preg_replace($pattern, $replacement, $string);
April-15-2003

$string = 'The a b';
$patterns = array();
$patterns[0] = '/a/';
$patterns[1] = '/b/';
$replacements = array();
$replacements[0] = '1';
$replacements[1] = '2';
echo preg_replace($patterns, $replacements, $string);
The 1 2

preg_filter

类似preg_replace,但是preg_filter() 函数只返回匹配成功的结果,而 preg_replace() 返回所有结果,不管是否匹配成功

preg_filter (array|string $pattern, array|string $replacement, array|string $subject, int $limit = -1, &$count): array|string|null
$string = ['aaa', 'bbb'];
$patterns = array('/aaa/', '/abb/');
$replacements = array('***', '###');
print_r(preg_filter($patterns, $replacements, $string));
print_r(preg_replace($patterns, $replacements, $string));
Array ( [0] => *** ) 
Array ( [0] => *** [1] => bbb )

preg_split

使用正则分割字符串

preg_split (string $pattern, string $subject, int $limit = -1, int $flags = 0): array|false
  • $pattern:正则表达式

  • $subject:分隔的字符串

  • $limit:可选参数,如果指定,就将限制分隔得到的子串最多只有 limit 个,并且最后一个子串将包含所有剩余部分;limit 值为 -1、0 或 NULL 时都代表“不限制”,建议使用 NULL

  • $flags:可选参数,它有 3 个取值。

    • 若设置为PREG_SPLIT_NO_EMPTY,则 preg_split() 将返回分隔后的非空部分
    • 若设置为PREG_SPLIT_DELIM_CAPTURE,则分隔的模式中的括号表达式将被捕获并返回
    • 若设置为PREG_SPLIT_OFFSET_CAPTURE,则对于每一个出现的匹配返回时会附加字符串偏移量

// 使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
Array (
    [0] => hypertext
    [1] => language
    [2] => programming
)

// 将一个字符串分隔为组成它的字符
$str = 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
Array (
    [0] => s
    [1] => t
    [2] => r
    [3] => i
    [4] => n
    [5] => g
)

preg_quote

转义正则表达式字符

preg_quote (string $str, ?string $delimiter): string
  • $str:字符串
  • $delimiter:额外增加的需要转义的字符

正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : - #


$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords;
\$40 for a g3\/400