在一个preg_match中匹配两个正则表达式模式

时间:2011-05-24 19:41:01

标签: php regex preg-match

由于我的脚本存在限制,我遇到了一个问题,我需要确保字符串匹配两个正则表达式模式中的一个,而只调用preg_match()一次。

以下是我的一些代码:

public static function get_file_host_from_link($link)
{
    foreach(Filehosts::$file_hosts as $key => $val)
    {
        if(preg_match("#{$val["regex"]}#", $link))
        {
            // We have a match, return this file host information
            return $key;
        }
    }
    // We've looped through all the file hosts and it hasn't matched,
    // return false
    return false;
}

现在,匹配Fileserve.com URL的问题是可以有两种类型的有效URL结构。其中之一是:

http://www.fileserve.com/file/aHd8AHD

和另一个:

http://www.fileserve.com/file/zR8VJVM/file_name.zip

目前,我可以使用此正则表达式完美匹配第一个结构:^http://www.fileserve.com/file/[a-zA-Z0-9]+$但我还需要使用以下内容匹配其他网址结构:http://www.fileserve.com/[a-zA-Z0-9]+/[a-zA-Z0-9_-\.]+$。如何使用现有代码执行此操作并仅调用preg_match()一次?我想到了这样的事情:

(^http://www.fileserve.com/file/[a-zA-Z0-9]+$|http://www.fileserve.com/[a-zA-Z0-9]+/[a-zA-Z0-9_-\.]+$)

据我所知,“匹配第一个正则表达式或第二个正则表达式”,但我不知道这是否有效。

谢谢!

1 个答案:

答案 0 :(得分:6)

以下内容应该有效:

^http://www.fileserve.com/file/[a-zA-Z0-9]+(/[-a-zA-Z0-9_\.]+)?$

括号中的所有内容之后的?使其成为可选项。

另请注意,字符类[a-zA-Z0-9_-\.]无效,因为-指定了范围,除非它已被转义或在开始时。

您要么[-a-zA-Z0-9_\.]还是[a-zA-Z0-9_\-\.](我在答案中使用了第一个)。