在中间符号正则表达式和其余字符串

时间:2017-05-25 10:50:32

标签: php regex preg-match

我有一个像这样的文件名

1x5 Girl In The Flower Dress.mkv

这意味着Season 1 Episode 5

In The Flower Dress
2x6.English,.Fitz.or.Percy.avi

这意味着Season 2 Episode 6

English, Fitz or Percy

如何提取季节编号,剧集编号和系列名称

4 个答案:

答案 0 :(得分:2)

输入




 <代码> 2x6.English,.Fitz.or.Percy.avi&#XA;  
&#XA;& #xA;

试试这个:

&#xA;&#xA;
  preg_match(“/(\ d *)x(\ d *)。?(。*)\。 (。*)/“,$ input,$ output_array);&#xA;  
&#xA;&#xA;

output_array

&#xA;&#xA;
  array(&#xA; 0 =&gt; 2x6.English,.Fitz.or.Percy.avi&#xA; 1 =&gt; 2 // Season&#xA; 2 =&gt; 6 //剧集&#xA; 3 =&gt;英文,.Fitz.or.Percy // title&#xA; 4 =&gt; avi&#xA;)&#xA;  
&#xA;

答案 1 :(得分: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

答案 2 :(得分:1)

首先,我想写:$out=preg_split('/[\. x]/',$in,3,PREG_SPLIT_NO_EMPTY);但是因为标题词可以用点分隔而你不想捕获文件后缀,所以我不得不把这个方法加入。

Barmar的方法包括文件后缀,因此需要额外处理。 Ravi的模式并不像它那样精致。

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

答案 3 :(得分: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+来匹配季节或剧集编号中的多个数字。