正则表达式解析视频持续时间字符串

时间:2015-07-27 20:06:35

标签: php regex

我想在评论中找到所有视频时长链接并将其转换为锚标记。

持续时间可能如下:

01:20:55 (h:m:s)
20:30 (m:s)
1:21 (m:s)
1:35:12 (h:m:s)

我觉得我可能会很接近,但对于正则表达式来说还是新手

http://regexr.com/3bfmu

^([\d]{1,2}\:)?([\d]{1,2})?\:([\d]{1,2})$

将在此上下文中使用:

$parsedTimeCommentString = preg_replace("/^([\d]{1,2}\:)?([\d]{1,2})?\:([\d]{1,2})$/", 
"<a href=\"#\" class=\"video-seek\" data-seek=\"$1:$2:$3\">$1:$2:$3</a>",
 $comment['comment']);

3 个答案:

答案 0 :(得分:3)

删除锚点,并使用非捕获组禁止冒号:

(?:(\d{1,2}):)?(\d{1,2}):(\d{2})

Live Demo

答案 1 :(得分:1)

看起来可能很奇怪,但我认为看起来应该更像这样:

(?<![\d:])(?:(?:(\d\d?):([0-5]\d))|([0-5]?\d)):([0-5]\d)(?![\d:])

保持格式:hh:mm:ss,h:mm:ss,mm:ss,m:ss并避免匹配无效(用于时间格式化)字符串,如:1:3:4,14:1:14 ,45:4:4,88:99,345:456(如45:45),2:3等。

DEMO

它以1美元和4美元的秒数捕获小时数,但是分钟数在2美元或3美元中被捕获。

答案 2 :(得分:0)

我会删除行锚(^ $),以便您的字符串可以匹配其他文本中的时间戳。此外,您应该将第二个捕获组设置为非可选,以便类似于&#39;:3&#39;无法通过。并且您希望使用/ g使其全局化,以便它替换所有出现的内容。像这样:

/([\d]{1,2}\:)?([\d]{1,2})\:([\d]{1,2})/g