2

我需要解析一个字符串并替换不符合我的媒体播放器队列的正常格式的电视节目名称的特定格式。

一些例子

显示.名称。2x01 .HDTV.x264 应该是 Show.Name。S02E01 .HDTV.x264节目
名称。10x05 .HDTV.XviD 应该是 Show.Name。S10E05 .HDTV.XviD

在节目名称之后,x 之前可能有 1 或 2 位数字,我希望输出始终是带有两位数字的 S,因此如果需要,请添加前导零。在 x 之后,它应该始终是带有两位数的 E。

我浏览了 preg_replace、split 和 match 函数的手册页,但不太清楚我应该在这里做什么。我可以匹配我想要的字符串部分,/\dx\d{2}/所以我想首先检查字符串是否具有该模式,然后尝试找出如何将这些部分从匹配项中拆分出来,但我没有得到任何结果。

我最好用例子,所以如果你能用一个很好的例子给我指出正确的方向。我现在唯一的测试区域是 PHP 4 安装,所以请不要使用 PHP 5 特定说明,一旦我了解发生了什么,我可能会在以后为 PHP 5 更新它(如果需要):)

4

3 回答 3

1

preg_replace 是你正在寻找的函数。

您必须编写一个选择正确位置的正则表达式模式。

  <?php
  $replaced_data = preg_replace("~([0-9]{2})x([0-9]{2})~s", "S$1E$2", $data);
  $replaced_data = preg_replace("~S([1-9]{1})E~s", "S0$1E", $replaced_data);
  ?>

抱歉,我无法对其进行测试,但它应该可以工作。

于 2013-10-26T06:10:40.023 回答
1

preg_replace_callback()使用该功能的另一种方式:

$subject = <<<'LOD'
Show.Name.2x01.HDTV.x264 should be Show.Name.S02E01.HDTV.x264
Show.Name.10x05.HDTV.XviD should be Show.Name.S10E05.HDTV.XviD
LOD;

$pattern = '~([0-9]++)x([0-9]++)~i';
$callback = function ($match) {
    return sprintf("S%02sE%02s", $match[1], $match[2]);
};

$result = preg_replace_callback($pattern, $callback, $subject);

print_r($result);
于 2013-10-26T06:48:42.600 回答
1

#sprintf使用PHP4及以下版本作为解决方案的不同方法。

$text = preg_replace('/([0-9]{1,2})x([0-9]{2})/ie',
                     'sprintf("S%02dE%02d", $1, $2)', $text);

注意:从PHP5.5 开始e,修饰符的使用已被贬低,因此请使用preg_replace_callback()

$text = preg_replace_callback('/([0-9]{1,2})x([0-9]{2})/', 
      function($m) {
         return sprintf("S%02dE%02d", $m[1], $m[2]);
      }, $text);

输出

Show.Name.S02E01.HDTV.x264
Show.Name.S10E05.HDTV.XviD

查看工作演示

于 2013-10-26T07:00:37.177 回答