Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找所有出现的';可以解释为时间';_Php_Regex_Parsing_Time - Fatal编程技术网

Php 查找所有出现的';可以解释为时间';

Php 查找所有出现的';可以解释为时间';,php,regex,parsing,time,Php,Regex,Parsing,Time,有没有一种有效的方法来搜索可能代表时间的子字符串 例如,此消息: 我们明天14:30见面,还是2:30见面 应返回('14:30','2:30pm')。使用一个简单的正则表达式可以很容易地找到hh:mm时间,但我想知道是否有现有的解决方案可以找到比简单情况更多的结果。我提出了一个正则表达式: ^((\d{1,2}:\d{2}\s?([ap]m?)?)|(\d{1,2}\s?[ap]m?))$ 它匹配: 2:10 14:20 10:00am 3:49p 4pm 10a 但不是: 12 22:

有没有一种有效的方法来搜索可能代表时间的子字符串

例如,此消息:

我们明天14:30见面,还是2:30见面


应返回
('14:30','2:30pm')
。使用一个简单的正则表达式可以很容易地找到hh:mm时间,但我想知道是否有现有的解决方案可以找到比简单情况更多的结果。

我提出了一个正则表达式:

^((\d{1,2}:\d{2}\s?([ap]m?)?)|(\d{1,2}\s?[ap]m?))$
它匹配:

2:10
14:20
10:00am
3:49p
4pm
10a 
但不是:

12
22:342
14:0
20rpm
如图所示

我认为它要比这聪明得多太难了。例如,“明天2点后我有2节课”你不能期望一个程序正确地识别哪些数字可以被解释为时间,除非它能够理解语义——但这是一个完全不同的故事


PS:正则表达式还匹配99:99 am这样的字符串,可以修复,但会使正则表达式更加混乱,不值得在IMO中修复。

您还想匹配什么?让我们在5点讨论这个问题,好吗?不虽然我可以在中午做,但午夜已经过去了。我一直忙到一刻钟;我可以给你30分钟,但是一刻钟开个会。比我自己的正则表达式“有点”复杂,但绝对是一个好的开始。简化正则表达式:
^\d{1,2}:\d{2}\s*(?:[ap]m?)\d{1,2}\s*[ap]m$
我删除了所有捕获组。这将产生一个更清晰的结果数组。@niki您破坏了一些功能(现在它与11:111匹配),但我喜欢它。事实上,我有一些更干净的东西,但我认为OP会希望与整个东西相匹配,这样就可以忽略这些群体。