2016-03-21 106 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:記得在將來檢查我的原始輸出。