2015-11-02 234 views
2

我想用正則表達式:PHP的preg_match和正則表達式的正則表達式

/(.*)[.\s][sS](\d{1,20})[eE](\d{1,100}).*/i 

要篩選的電視劇稱號。 (例如,大爆炸理論S04E05)爲了移除劇集字符串(S04E05)。

我測試了我的正則表達式與http://www.phpliveregex.com/和一切工作正常。但包括它到我的網站,我會得到整個標題,包括情節串。 的preg_match的返回值爲0

我的代碼:

$ret=preg_match("/(.*)[.\s][sS](\d{1,20})[eE](\d{1,100}).*/i", $title,$output); 
if($ret==1){ 
    $title_without=$output[1]; 
} 
+3

然後顯示'$ title'中的內容。如果我們無法看到您輸入的內容,我們無法幫助您修復正則表達式。 –

+0

我認爲是這樣的:(例如,大爆炸理論S04E05) –

+0

$ title =「大爆炸理論S04E24」 – PM84

回答

1

注意,雙引號字符串中,你需要使用雙反斜線逃脫正則表達式速記班。

您可以使用您正則表達式一個preg_replace函數內內單引號,這樣你就不必使用雙反斜槓:

$title= "The Big Bang Theory S04E05"; 
$ret=preg_replace('/^(.*)[.\s]s\d{1,20}e\d{1,100}(.*)/i', '\1\2', $title); 
echo $ret; 

IDEONE demo。結果:The Big Bang Theory

反向引用\1\2將恢復在劇集子串之前和之後的子串。

由於您使用的是/i修飾符,因此無需使用[eE][Ss],只需在任何情況下使用單個字母即可。

爲了情節和插曲子本身之前返回的字符串,只需使用捕獲組與preg_match喜歡這裏:

$title= "The Big Bang Theory S04E05"; 
$ret=preg_match('/^(.*)[.\s](s\d{1,20}e\d{1,100})/i', $title, $match); 
echo $match[1] . PHP_EOL; // => The Big Bang Theory 
echo $match[2];   // => S04E05 

another demo

+0

我不太確定我的區別。但是,這將工作... – PM84

+0

是否有可能獲得情節字符串? – PM84

+0

你的正則表達式的問題在我的答案的開始處說明。你使用雙引號表示正則表達式聲明,因此,像'\ s'這樣的類的反斜槓必須加倍。當使用單引號時,不必將反斜槓加倍爲''''',那麼將其視爲文字反斜線。此外,我建議使用捕獲組,以便我們可以訪問我們感興趣的細節。 –

0

你可以查找單詞和匹配所有,但最後一個:

$matches = array(); 
$regex = "/^([\w ]*) [\w]+$/i"; 
$title = "The Big Bang Theory S04E05"; 
preg_match_all ($regex, $title, $matches); 

現在你所有的比賽都在$matches