2017-05-25 100 views
1

後,我有這樣的提取字符之前和中間的符正則表達式和休息串

1x5 Girl In The Flower Dress.mkv 

文件名,這意味着Season 1 Episode 5In The Flower Dress

2x6.English,.Fitz.or.Percy.avi 

這意味着English, Fitz or Percy

如何Season 2 Episode 6提取季節編號,劇集編號和系列名稱

+0

這是一個非常簡單的正則表達式。什麼部分給你帶來麻煩? – Barmar

+0

使用'\ d'來匹配數字,'x'匹配中間的符號,並使用捕獲組來獲得匹配的部分。 – Barmar

+0

我會嘗試你的建議,並讓你知道@Barmar –

回答

0

使用捕獲組來獲取匹配模式部分的字符串部分。

preg_match('/(\d+)x(\d+)\s*(.*)/', '1x5 Girl In The Flower Dress.mkv', $match); 

$match[1]'1'$match[2]'5',並$match[3]'Girl in the Flower Dress.mov'

您需要使用\d+來匹配季節或劇集編號中的多個數字。

+0

Thanku爲此。我可以使用'str_replace($ match ['0'],「」,$ srt);'獲取系列名稱 –

+0

您可以添加另一個捕獲組以獲取所有內容。 – Barmar

+0

好吧,明白了。再次感謝。 –

2

輸入

2x6.English,.Fitz.or.Percy.avi 

試試這個:

preg_match("/(\d*)x(\d*).?(.*)\.(.*)/", $input, $output_array); 

output_array

array(
    0 => 2x6.English,.Fitz.or.Percy.avi 
    1 => 2 // Season 
    2 => 6 // Episode 
    3 => English,.Fitz.or.Percy // title 
    4 => avi 
) 
+0

Thanku您的回答! –

+0

永遠歡迎:) @再試一次 –

1

如何更直接的解決方案嗎?

$title = '2x6.English,.Fitz.or.Percy.avi'; 

preg_match_all('~(?:(\d+)x(\d+)|(?!^)\G)[^\w\r\n,-]*\K[\w,-]++(?!$)~m', $title, $matches); 
$matches = array_map('array_filter', $matches); 

echo "Season {$matches[1][0]} Episode {$matches[2][0]} of ".implode(' ', $matches[0]); 

輸出:

Season 2 Episode 6 of English, Fitz or Percy 
+0

Thanku您的回答! –

+0

偉大的方法! –

1

起初,我想寫:$out=preg_split('/[\. x]/',$in,3,PREG_SPLIT_NO_EMPTY);,但因爲標題的話可以點分隔的,你不想要捕捉的文件後綴,我不得不斌該方法。

Barmar的方法包含文件後綴,因此需要額外處理。拉維的模式並不盡如人意。

Revo的方法受到啓發,但需要的步數是我模式的4倍。 Regex Demo我們的兩個方法都需要額外的函數調用來準備標題。我發現我的方法非常直接,不需要任何數組過濾。

$input[]='1x5 Girl In The Flower Dress.mkv'; 
$input[]='2x6.English,.Fitz.or.Percy.avi'; 

foreach($input as $in){ 
    preg_match('/(\d+)x(\d+)[ \.](.+)\..+/',$in,$out); 
    echo "<div>"; 
     echo "Season $out[1] Episode $out[2] of ",str_replace('.',' ',$out[3]); 
    echo "</div>"; 
} 

輸出:

Season 1 Episode 5 of Girl In The Flower Dress 
Season 2 Episode 6 of English, Fitz or Percy 
+0

Thanku您的回答! –

相關問題