【发布时间】:2011-07-12 19:07:29
【问题描述】:
我正在尝试验证时区。示例:
UTC-12
UTC-6:30
所以 - UTC 将保持不变,符号将交替(+ 或 -),数字从 -12 变化到 +14。
我不明白为什么这个正则表达式不起作用(我得到无效):
$val = 'UTC+12';
$range = '-11:30|-11|-10:30|-10|-9:30|-9|-8:30|-8|-7:30|-7|-6:30|-6|-5:30|-5|-4:30|-4|-3:30|-3|-2:30|-2|-1:30|-1|-0:30|\+0|\+0:30|\+1|\+1:30|\+2|\+2:30|\+3|\+3:30|\+4|\+4:30|\+5|\+5:30|\+5:45|\+6|\+6:30|\+7|\+7:30|\+8|\+8:30|\+8:45|\+9|\+9:30|\+10|\+10:30|\+11|\+11:30|\+12|\+12:45|\+13|\+13:45|\+14';
$regex = '/^UTC(\+|-)(' . $range . ')/';
if(preg_match($regex, $val)){
echo 'valid';
}else{
echo 'not valid';
}
【问题讨论】:
-
至于为什么它不起作用,您是在告诉正则表达式匹配
UTC+-12 or UTC--12。现在关于那个范围变量......据我所知,这不是你应该如何使用正则表达式。如果您阅读一些有关匹配时间的基本正则表达式教程,它们会为您提供帮助。 -
@inTide:你的第一句话就是答案,应该这样发布,所以我们可以投票
-
不确定我是否在关注范围变量。这些是唯一有效的 UTC 偏移量。例如,我不能有 UTC-8:10。我可以使用 implode 从数组构建该字符串 - 有什么区别?
-
我的意思是不要输入所有可能的变量,更简单的
(\+|-)((1?[0-9](:30)?)|((5|8|12|13):45))应该匹配所有内容。 @Daniel我评论而不是回答的原因是因为我正在(思考)其他事情并且只是瞥了一眼问题。我没有提供我提到的正则表达式,所以觉得这不是一个完整的答案,只是一个评论。哦,顺便说一句,我还没有测试过那个正则表达式,我想我在某个地方放错了括号,但这是一般的想法。 -
@inTide:你是对的。很有道理。