PHP preg_替换、拆分或匹配?

PHP preg_替换、拆分或匹配?,php,regex,preg-replace,preg-match,preg-split,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 在show名称之后,x前面可能有1或2个数字,我希望输出始终是一个有两个数字的S,因此如果需要,请添加前导零。在x之后,它应该始终是一个有两个数字的E 我浏览了手册中的preg_repl

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

一些例子

Show.Name.2x01.HDTV.x264应该是Show.Name.S02E01.HDTV.x264
Show.Name.10x05.HDTV.XviD应为Show.Name.S10E05.HDTV.XviD

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

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


我用例子做得最好,所以如果你能用一个例子给我指出正确的方向,那就太好了。我现在唯一的测试区域是PHP4安装,所以请不要提供PHP5的具体说明,一旦我了解了发生了什么,我可能会在以后为PHP5更新它,如果需要:)

preg\u 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);
  ?>


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

另一种方法是使用
preg\u replace\u 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);

$subject=使用PHP4及以下内容作为解决方案的不同方法

$text = preg_replace('/([0-9]{1,2})x([0-9]{2})/ie',
                     'sprintf("S%02dE%02d", $1, $2)', $text);
注意:从PHP5.5开始,
e
修饰符的使用被折旧,因此使用
preg\u replace\u callback()

输出

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

请参见

请不要PHP 5具体说明
——为什么不?为什么要使用古老的PHP版本?你为什么不想升级到更新的版本呢?我的媒体服务器运行自己的php4后端,我现在不想搞乱它。这是另一次的问题你试过什么?请给我们看一些代码。没有人会安装PHP 4并为您完成工作。我不会要求任何人这样做,提供的各种代码示例似乎都能达到目标,因此这正是我要求的。您的正则表达式中没有字母,因此不需要
I
修饰符。在正则表达式中也不使用任何
元字符,这意味着也不需要
s
修饰符。此外,替换不处理前导
0
s,提问者明确表示他们希望看到。我修改了模式。为什么要使用
s
修饰符?!它仅在使用
元字符时有效。在正则表达式中不使用它。这是不必要的。而且,
[1-9]{1}
[1-9]
完全相同。没有必要明确地说某件事只有一件;这意味着。@SverriM.Olsen:你忘了
x
这封信。@casimimirithippolyte是的,我错过了。不过,使用
[xX]
就足够了。然而,我从未在电视节目文件名的插曲/季节部分看到大写X,但为了安全起见,它们可能会出现得更好。这显然是实现目标的最短路径,一个具有所有必需方面的函数,感谢额外的解决方案:)您应该避免使用
e
修饰符--。检查。请改用。谢谢,我以前没有见过这个函数,绝对值得进一步研究:)
Show.Name.S02E01.HDTV.x264
Show.Name.S10E05.HDTV.XviD