PHP:如何将 in_array 与正则表达式字符串数组一起使用?
PHP: How to use in_array with an array of regex strings?
我有一个由正则表达式字符串组成的路径数组:
$paths = [
'/cars$',
'.*\/cars$',
'^cars\/.*/',
'/trucks$',
'.*\/trucks$',
];
我想检查我当前的路径是否与该数组中的某些内容匹配,例如:
if (in_array($current_path, $paths)) {
//Do something
}
例如,如果我的 URL 是 some-site.com/cars
或 some-site.com/cars/honda
那么我想 return 在 if 语句中添加一些东西。
但我不知道如何使用正则表达式来实现它。
我使用 preg_grep()
进行了调查,但这似乎一次只能使用一组正则表达式规则。
我可以让它与 preg_match
和字符串一起使用,例如:
$paths = '/cars$|.*\/cars$|^cars\/.*/|/trucks$|.*\/trucks$';
if (preg_match($paths, $current_path)) {
//Do something
}
但我最终会在这个列表中添加很多 URL,所以我更愿意使用数组。
谁知道有没有实现这个功能的?
我想我可以使用 implode() 将它 return 成一个字符串,例如:
$paths = [
'/cars$',
'.*\/cars$',
'^cars\/.*/',
'/trucks$',
'.*\/trucks$',
];
$paths_string = implode('|', $paths);
if (preg_match($paths_string, $current_path)) {
//Do something
}
如果你想知道,数组的哪些模式与字符串匹配,使用array_filter如何。
$res = array_filter($paths, function ($v) USE ($url) {
return preg_match('~'.$v.'~', $url);
});
echo count($res)." patterns matched:\n"; print_r($res);
2 patterns matched: Array ( [0] => /cars$ 1 => .*/cars$ )
使用 ~
作为模式分隔符,因此您不需要转义所有这些 url 斜杠。
请注意,.*/cars$
看起来多余,如果您已经匹配 /cars$
。
如果您想在第一场比赛中破门,请使用 foreach
,这可能更有效 (demo)。
foreach($paths AS $v) {
if (preg_match('~'.$v.'~', $url)) {
echo $v.' matched'; break;
}
}
您可以使用 preg_match
的 $out
更轻松地 $url
的 display the matched part。
我有一个由正则表达式字符串组成的路径数组:
$paths = [
'/cars$',
'.*\/cars$',
'^cars\/.*/',
'/trucks$',
'.*\/trucks$',
];
我想检查我当前的路径是否与该数组中的某些内容匹配,例如:
if (in_array($current_path, $paths)) {
//Do something
}
例如,如果我的 URL 是 some-site.com/cars
或 some-site.com/cars/honda
那么我想 return 在 if 语句中添加一些东西。
但我不知道如何使用正则表达式来实现它。
我使用 preg_grep()
进行了调查,但这似乎一次只能使用一组正则表达式规则。
我可以让它与 preg_match
和字符串一起使用,例如:
$paths = '/cars$|.*\/cars$|^cars\/.*/|/trucks$|.*\/trucks$';
if (preg_match($paths, $current_path)) {
//Do something
}
但我最终会在这个列表中添加很多 URL,所以我更愿意使用数组。
谁知道有没有实现这个功能的?
我想我可以使用 implode() 将它 return 成一个字符串,例如:
$paths = [
'/cars$',
'.*\/cars$',
'^cars\/.*/',
'/trucks$',
'.*\/trucks$',
];
$paths_string = implode('|', $paths);
if (preg_match($paths_string, $current_path)) {
//Do something
}
如果你想知道,数组的哪些模式与字符串匹配,使用array_filter如何。
$res = array_filter($paths, function ($v) USE ($url) {
return preg_match('~'.$v.'~', $url);
});
echo count($res)." patterns matched:\n"; print_r($res);
2 patterns matched: Array ( [0] => /cars$ 1 => .*/cars$ )
使用 ~
作为模式分隔符,因此您不需要转义所有这些 url 斜杠。
请注意,.*/cars$
看起来多余,如果您已经匹配 /cars$
。
如果您想在第一场比赛中破门,请使用 foreach
,这可能更有效 (demo)。
foreach($paths AS $v) {
if (preg_match('~'.$v.'~', $url)) {
echo $v.' matched'; break;
}
}
您可以使用 preg_match
的 $out
更轻松地 $url
的 display the matched part。