正则表达式解析视频时长字符串

4

我希望能够在评论中找到所有视频时长链接,并将它们转换为锚点标签。

这些时长可能看起来像:

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']);

1
持续时间都在一个字符串中吗?删除尾部锚点应该就可以为您解决问题。https://regex101.com/r/hS1zG2/1 - chris85
刚刚更新了我的正则表达式链接,包括使用案例。 - Titan
好的,你当前的正则表达式有什么问题吗?所有的值都被找到了,在该网站上启用“global”标志即可看到。preg_replace默认是全局的。 - chris85
那绝对是我被绊倒的地方,没有在该网站上启用全局标志! - Titan
3个回答

4
去除锚点,并使用非捕获组来禁止冒号:
(?:(\d{1,2}):)?(\d{1,2}):(\d{2})

Live Demo


1
我认为对于秒数,我只需要使用\d{2}。我从未见过将m:s格式化为5:3表示5:03的情况。 - Adam Prescott

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等。

演示

它捕获$1中的小时和$4中的秒,但分钟在$2或$3中捕获。

0
我会删除行锚点(^$),这样您的字符串就可以匹配其他文本中的时间戳。此外,您应该使第二个捕获组非可选,这样像“:3”之类的东西就无法通过。而且您需要使用/g全局标志,以便它替换所有出现的情况。就像这样:
/([\d]{1,2}\:)?([\d]{1,2})\:([\d]{1,2})/g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接