使用php regex分割字符串

时间:2017-01-05 10:29:09

标签: php regex

我无法将此字符串拆分为组件。 我的示例字符串是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 个答案:

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

然后,您可以使用nameseasonepisode访问$m["name"]$m["season"]$m["episode"]值。

模式详情

  • ^ - 字符串开头
  • (?<name>.*?) - 一个命名的捕获组,匹配换行符号以外的任何0+字符,尽可能少,直到第一个....
  • \.S - .S文字字符的子字符串
  • (?<season>\d+) - 一个&#34;赛季&#34;命名捕获组匹配1+位数
  • E - 文字字符E
  • (?<episode>\d+) - 一个&#34;插曲&#34;命名捕获组匹配1+位数