preg_replace不匹配#210

时间:2016-03-21 15:54:37

标签: php regex

我有一段带有时间码的文字,我想删除时间码。

$pattern = "~(\d+\s\d+:\d+:\d+,\d+\s-->\s\d+:\d+:\d+,\d+)~";
$replace = "";
$subject = "1 00:00:30,304 --> 00:00:34,165 Our focus today is to share with you 2 00:00:34,165 --> 00:00:36,715 key components of preparing and submitting 3 00:00:36,715 --> 00:00:40,715 a warranty transaction...";
echo preg_replace($pattern, $replace, $subject);

我在网上尝试的所有正则表达式测试人员都认为它是有效的正则表达式,所以我不确定我做错了什么,其他数百个正则表达式问题似乎都不符合我的问题。

2 个答案:

答案 0 :(得分:2)

你也可以使用更好的阅读方法(更短):

$regex = "~([\d:\h,]+ --> [\d:,]+)~";
$replace = "";
$subject = "1 00:00:30,304 --> 00:00:34,165 Our focus today is to share with you 2 00:00:34,165 --> 00:00:36,715 key components of preparing and submitting 3 00:00:36,715 --> 00:00:40,715 a warranty transaction...";
echo preg_replace($regex, $replace, $subject);

简单地将您的模式组合在一个角色类中,并使用水平空间(\h)代替 请参阅 a demo on regex101.com

答案 1 :(得分:0)

显然第一个数字后面有多个空格,因为我只搜索\ s它不匹配。
我将其改为\ s +并且有效。

最终的正则表达式字符串是这个

〜(\ d + \ S + \ d +:\ d +:\ d +,\ d + \ S - > \ S \ d +:\ d +:\ d +,\ d +)〜 问题是数据库中的字符串在Windows格式(crlf)的初始数字后面有新行。 当我复制并粘贴到它所使用的测试页面时,因为它只是一个换行符,但是当面对真实数据时它不再匹配而且preg_replace没有抓住它,因为我只是尝试匹配一个空格而不是两个空格。

将+添加到\ s后开始工作。

TL; DR:要记得将来检查我的原始输出。