PHP preg_replace,拆分还是匹配?

时间:2013-10-26 06:00:09

标签: php regex preg-replace preg-match preg-split

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

一些例子

Show.Name。 2x01 .HDTV.x264应为Show.Name。 S02E01 .HDTV.x264
Show.Name。 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:)

3 个答案:

答案 0 :(得分: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);
  ?>

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

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

答案 2 :(得分:1)

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

$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

请参阅working demo