2016-03-21 129 views
1

我有一段带时间码的文本,我想删除时间码。preg_replace不匹配#210

$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); 

所有这一切我已经尝试过网上正则表达式测试人员说,这是有效的正则表达式,所以我不知道我做错了,并没有其他的几百个正则表达式的问题似乎适合我的问题。

+1

分而治之:首先测试更简单的工作 –

+0

如果有更好的地方问正则表达式问题,我可以去那里。我知道这里有很多正则表达式问题,我只是为什么它不起作用。 – AndyD273

+1

你期望什么? http://sandbox.onlinephpfunctions.com/code/aecdf337a3aa10dcd3616e3ab4e06f841f902f71 – AbraCadaver

回答

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

不错!我稍微将它改成了〜〜([\ d:\ h \ s +,] + - > [\ d:,] +)〜'来捕捉我第一次错过的额外换行符,更好。谢谢! – AndyD273

+0

@ AndyD273:'\ s'包含'\ h',所以你可以将你的第一个括号改为'[\ d:\ s,]'。 – Jan

0

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

最后的正则表达式的字符串是本

〜(\ d + \ S + \ d +:\ d +:\ d +,\ d + \ S - > \ S \ d +:\ d +:\ d +,\ d +) 〜 问题是数据库中的字符串在窗口格式(crlf)的最初数字之后有新行。 当我复制并粘贴到测试页面时,因为它只是一个换行符,但是当面对真正的数据时它不再匹配,preg_replace也没有捕获它,因为我只是试图匹配一个白色空间而不是两个。

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

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