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/carssome-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);
});

See PHP demo at 3v4l.org

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 更轻松地 $urldisplay the matched part