检查uri字符串是否与列表中的任何模式匹配

时间:2017-11-06 13:48:10

标签: php regex

我想检查当前$uri_string是否匹配任何这些模式

$uri_string = 'project/details/1258';

$uri_patterns = [
   'project/foo/',
    'project/bizz/',
];


foreach($uri_patterns as $pattern) {
    if(preg_match('/' . $pattern. '/i', $uri_string) == 1) {
        echo 'Is a match!';
    }
}

因此,如果在某个时刻$uri_string = 'project/foo/123/some-other-params';,那么这可能与'project/foo/'模式相匹配。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您需要从正则表达式中转义/斜杠,如:

$uri_string = 'project/details/1258';

$uri_patterns = [
   'project/foo/',
    'project/bizz/',
];


foreach($uri_patterns as $pattern) {
    $pattern = preg_quote($pattern, '/');
    if(preg_match("/$pattern/i", $uri_string) == 1) {
        echo 'Is a match!';
    }
}

这使用preg_quote()来逃避斜杠。

或者,您可以对正则表达式使用不同的delimiter,例如#

 preg_match("#$pattern#i", $uri_string);

或者你可以完全忽略正则表达式并使用字符串解析函数,如:

foreach($uri_patterns as $pattern) {
    if(strpos($uri_string, $pattern) !== false) {
        echo 'Is a match!';
    }
} 

答案 1 :(得分:2)

我认为你需要逃避这些正斜杠:

$uri_patterns = [
    'project\/foo\/',
    'project\/bizz\/',
];

然后为了您的比赛,请使用:

preg_match('/' . $pattern . '/i', $uri_string, $matches);
if (!empty($matches)) {
    echo 'Is a match!';
}