由于我的脚本存在限制,我遇到了一个问题,我需要确保字符串匹配两个正则表达式模式中的一个,而只调用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_-\.]+$)
据我所知,“匹配第一个正则表达式或第二个正则表达式”,但我不知道这是否有效。
谢谢!
答案 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_\-\.]
(我在答案中使用了第一个)。