【问题标题】:Timezones validation regex时区验证正则表达式
【发布时间】: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:你是对的。很有道理。

标签: php regex pcre


【解决方案1】:

您需要转义正则表达式中的 + 符号,以免它们贪婪地重复。

例如,+8 变为 \+8。像这样的东西(php不是我的语言):

$val = 'UTC+12'; $range = '-12|-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';

$range = str_replace ( '+' , '\+' , $range)

$regex = '/^UTC(' . $range . ')/';

    if(preg_match($regex, $val)){
        echo 'valid';
    }else{
        echo 'not valid';
    }

【讨论】:

  • 谢谢。这就是我在我的php文件中的方式。我想我是从不正确的例子中发布的。我已经更新了帖子 - 但仍然没有骰子。
  • $regex = '/^UTC(' . $range . ')/'; 此外,您的正则表达式强制使用额外的符号 -+。查看更新的答案。
  • @Andre:请注意,这不是 agent-j 唯一改变的事实。看看第三行!
【解决方案2】:

(代表问题作者发布解决方案,将其移至答案空间)

这太简单了。我忘记了我已经在 $range 数组中使用了符号。我什至不必检查我的正则表达式中的符号。

$regex = '/^UTC(' . $range . ')/';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多