PHP:如何在正则表达式字符串数组中使用in_array?

时间:2019-05-21 07:46:20

标签: php regex preg-match

我有一个包含正则表达式字符串的路径数组:

  $paths = [
    '/cars$',
    '.*\/cars$',
    '^cars\/.*/',
    '/trucks$',
    '.*\/trucks$',
  ];

我想检查我当前的路径是否匹配该数组中的某个内容,例如:

if (in_array($current_path, $paths)) {
  //Do something
}

例如,如果我的URL是some-site.com/carssome-site.com/cars/honda,那么我想在if语句中返回一些内容。

但是我不知道如何使用正则表达式。

我使用preg_grep()进行了调查,但似乎一次只能使用一组正则表达式规则。

我可以将其与preg_match和一个字符串一起使用,例如:

$paths = '/cars$|.*\/cars$|^cars\/.*/|/trucks$|.*\/trucks$';

if (preg_match($paths, $current_path)) {
  //Do something
}

但是我最终将向此列表中添加许多URL,所以我更喜欢使用数组。

有人会知道是否有一种功能可以实现这一目标吗?

2 个答案:

答案 0 :(得分:3)

如果您想知道数组的哪些模式与字符串匹配,如何使用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个模式:数组([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
}