Php 提取中间符号正则表达式和rest字符串前后的字符

Php 提取中间符号正则表达式和rest字符串前后的字符,php,regex,preg-match,Php,Regex,Preg Match,我有一个这样的文件名 1x5 Girl In The Flower Dress.mkv 意思是《穿花裙》第一季第五集 意思是《英语,菲茨或珀西》第二季第六集 如何提取季号、集号和系列名称使用捕获组获取与模式部分匹配的字符串部分 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

我有一个这样的文件名

1x5 Girl In The Flower Dress.mkv
意思是《穿花裙》第一季第五集

意思是《英语,菲茨或珀西》第二季第六集


如何提取季号、集号和系列名称使用捕获组获取与模式部分匹配的字符串部分

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+来匹配季节或剧集编号中的多个数字。

使用捕获组来获取字符串中与部分模式匹配的部分

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+来匹配季节或剧集编号中的多个数字。

输入

2x6.English,.Fitz.or.Percy.avi
试试这个:

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

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

试试这个:

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

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

一个更直接的解决方案怎么样

$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
Season 1 Episode 5 of Girl In The Flower Dress
Season 2 Episode 6 of English, Fitz or Percy

一个更直接的解决方案怎么样

$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
Season 1 Episode 5 of Girl In The Flower Dress
Season 2 Episode 6 of English, Fitz or Percy

首先,我想写:$out=preg\u split'/[\.x]/',$in,3,preg\u split\u NO\u EMPTY;但是,因为标题词可以用点分隔,并且您不想捕获文件后缀,所以我不得不使用该方法

Barmar的方法包括文件后缀,因此需要额外的处理。拉维的图案并没有那么精致

Revo的方法是受启发的,但需要4倍于我的模式的步骤。我们的两个方法都需要额外的函数调用来准备标题。我发现我的方法非常直接,不需要任何数组过滤

$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>";
}

首先,我想写:$out=preg\u split'/[\.x]/',$in,3,preg\u split\u NO\u EMPTY;但是,因为标题词可以用点分隔,并且您不想捕获文件后缀,所以我不得不使用该方法

Barmar的方法包括文件后缀,因此需要额外的处理。拉维的图案并没有那么精致

Revo的方法是受启发的,但需要4倍于我的模式的步骤。我们的两个方法都需要额外的函数调用来准备标题。我发现我的方法非常直接,不需要任何数组过滤

$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>";
}

这是一个非常简单的正则表达式。哪个部分给您带来了麻烦?使用\d匹配数字,使用x匹配中间符号,使用捕获组获得匹配的部分。我将尝试您的建议,并让您知道@BarmarIs这就像preg_match/\dx\d/,'1x5穿花裙的女孩.mkv',$n@Barmar。这是一个非常简单的正则表达式。哪个部分给您带来了麻烦?使用\d匹配数字,使用x匹配中间符号,并使用捕获组获得匹配的部分。我将尝试您的建议,并让您知道@BarmarIs这就像preg_match/\dx\d/,'1x5穿花裙的女孩.mkv',$n@Barmar。谢谢。我可以使用str_替换$match['0'],$srt;若要获得系列名称,您只需添加另一个捕获组即可获得后面的所有内容。谢谢。我可以使用str_替换$match['0'],$srt;若要获得系列名称,您只需添加另一个捕获组即可获得后面的所有内容。谢谢您的回答!!谢谢你的回答!!谢谢你的回答!!好办法!!谢谢你的回答!!好办法!!谢谢你的回答!!谢谢你的回答!!