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

问题描述 投票:0回答:1

我无法将此字符串拆分为多个组件。 我的示例字符串是

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] ) 

php regex
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 演示

然后,您可以使用

name
season
episode
访问
$m["name"]
$m["season"]
$m["episode"]
值。

图案详情

  • ^
    - 字符串的开头
  • (?<name>.*?)
    - 一个命名捕获组,匹配除换行符之外的任何 0+ 个字符,尽可能少,直到第一个....
  • \.S
    -
    .S
    文字字符的子字符串
  • (?<season>\d+)
    - 一个名为捕获组匹配 1+ 位数字的“季节”
  • E
    - 文字字符
    E
  • (?<episode>\d+)
    - 名为捕获组匹配 1+ 位数字的“片段”
© www.soinside.com 2019 - 2024. All rights reserved.