2011-05-24 58 views
1

由于脚本中的限制,我遇到了一个问题,我需要确保一个字符串匹配两个正则表达式模式中的一个,而只调用一次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]+$但我也需要搭配其他URL结构使用这样的东西: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_-\.]+$)

这在我的知识是指“匹配第一个正则表达式或第二个”,但我不知道这是否会工作。

谢谢!

+0

你试过了吗? – 2011-05-24 19:43:42

回答

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_\-\.](我用我的第一个答案)。

+0

这工作。比我更快键入它... – Lucius 2011-05-24 19:45:28

+0

不敢相信我没有想到使用可选组...谢谢! – Josh 2011-05-24 19:49:04