PHP的preg_match和正则表达式的正则表达式

问题描述:

我想用正则表达式: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

注意,双引号字符串中,你需要使用双反斜线逃脱正则表达式速记班。

您可以使用您正则表达式一个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'这样的类的反斜杠必须加倍。当使用单引号时,不必将反斜杠加倍为''''',那么将其视为文字反斜线。此外,我建议使用捕获组,以便我们可以访问我们感兴趣的细节。 –

你可以查找单词和匹配所有,但最后一个:

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

现在你所有的比赛都在$matches