使用PHP正则表达式分割字符串

4

我在将这个字符串分割成组件时遇到了困难。我的示例字符串是Criminal.Minds.S10E22.WEB-DL.x264-FUM[ettv]。我想要将其分割成以下内容:Criminal Minds, 10, 22

虽然我稍微尝试过Perl正则表达式,但PHP的实现让我感到困惑。

我已经编写了以下代码:

$word = "Criminal.Minds.S10E22.WEB-DL.x264-FUM[ettv]";
// First replace periods and dashes by spaces
$patterns = array();
$patterns[0] = '/\./';
$patterns[1] = '/-/';
$replacement = ' ';
$word = preg_replace($patterns, $replacement, $word);
print_r(preg_split('#([a-zA-Z])+\sS(\d+)E(\d+)#i', $word));

这将输出 Array ( [0] => Criminal [1] => WEB DL x264 FUM[ettv] )。请告诉我正确的方向。

1个回答

3

如果字符串始终处于此格式中,请使用匹配而不是分割:

$word = "Criminal.Minds.S10E22.WEB-DL.x264-FUM[ettv]";
preg_match('~^(?<name>.*?)\.S(?<season>\d+)E(?<episode>\d+)~', $word, $m);
print_r($m);

请查看PHP演示
然后,您可以使用$m["name"]$m["season"]$m["episode"]访问nameseasonepisode的值。 模式详情
  • ^ - 字符串开头
  • (?<name>.*?) - 一个命名捕获组,匹配任何0个或多个字符(不包括换行符),尽可能少地匹配,直到第一个......
  • \.S - .S字面字符的子字符串
  • (?<season>\d+) - 一个名为"season"的捕获组,匹配1个或多个数字
  • E - 字面字符E
  • (?<episode>\d+) - 一个名为"episode"的捕获组,匹配1个或多个数字

谢谢。你能否详细解释一下正则表达式本身?特别是这部分:?<season> - Joel G Mathew
1
是的,我已经添加了详细信息。(?<name>...) 结构是 命名捕获组,允许以更习惯的方式访问您感兴趣的匹配部分。请注意,在存在其他格式的情况下,该模式通常可以通过在 (.*?)\.\S 之间添加可选消耗模式来进行调整。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接