我有一个包含正则表达式字符串的路径数组:
$paths = [
'/cars$',
'.*\/cars$',
'^cars\/.*/',
'/trucks$',
'.*\/trucks$',
];
我想检查我当前的路径是否匹配该数组中的某个内容,例如:
if (in_array($current_path, $paths)) {
//Do something
}
例如,如果我的URL是some-site.com/cars
或some-site.com/cars/honda
,那么我想在if语句中返回一些内容。
但是我不知道如何使用正则表达式。
我使用preg_grep()
进行了调查,但似乎一次只能使用一组正则表达式规则。
我可以将其与preg_match
和一个字符串一起使用,例如:
$paths = '/cars$|.*\/cars$|^cars\/.*/|/trucks$|.*\/trucks$';
if (preg_match($paths, $current_path)) {
//Do something
}
但是我最终将向此列表中添加许多URL,所以我更喜欢使用数组。
有人会知道是否有一种功能可以实现这一目标吗?
答案 0 :(得分:3)
如果您想知道数组的哪些模式与字符串匹配,如何使用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个模式:数组([0] => / cars $ 1 =>。* / cars $)
将~
用作模式定界符,因此您无需转义所有这些网址斜杠。
请注意,如果您已经匹配.*/cars$
,则/cars$
看起来很多余。
如果您想在首场比赛中休息,请使用foreach
,它可能更有效(demo)。
foreach($paths AS $v) {
if (preg_match('~'.$v.'~', $url)) {
echo $v.' matched'; break;
}
}
您可以使用$url
中的$out
来更轻松地访问preg_match
中的display the matched part。
答案 1 :(得分:1)
我认为我可以使用implode()将其返回到字符串,例如:
$paths = [
'/cars$',
'.*\/cars$',
'^cars\/.*/',
'/trucks$',
'.*\/trucks$',
];
$paths_string = implode('|', $paths);
if (preg_match($paths_string, $current_path)) {
//Do something
}