gpt4 book ai didi

PHP:如何将 in_array 与正则表达式字符串数组一起使用?

转载 作者:行者123 更新时间:2023-12-03 08:55:02 26 4
gpt4 key购买 nike

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

  $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 添加到此列表中,因此我更愿意使用数组。

有人知道是否有一个函数可以实现这一点吗?

最佳答案

如果你想知道数组的哪些模式与字符串匹配,可以使用 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$ )

使用 ~ 作为模式分隔符,因此您不需要转义所有这些网址斜杠。

请注意,如果您已经匹配 /cars$,则 .*/cars$ 看起来是多余的。


如果您想在第一次匹配时中断,请使用 foreach 这可能更有效( demo )。

foreach($paths AS $v) {
if (preg_match('~'.$v.'~', $url)) {
echo $v.' matched'; break;
}
}

您可以进一步轻松display the matched part通过使用 preg_match$out$url

关于PHP:如何将 in_array 与正则表达式字符串数组一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com