这个问题已经有了答案:
Understanding str_pad() with leading zeros
1答
这可能是一个简单的问题,但我在搜索之后没能弄清楚。我设法用20种不同的方法改变了输出,但没有一种是我想要的
<?php
$text = <<<DATA
Show.Name.2x05.HDTV.x264
Show.Name.2x06.HDTV.x264
Show.Name.2x07.HDTV.x264
Show.Name.2x08.HDTV.x264
Show.Name.2x09.HDTV.x264
DATA;
$text = preg_replace('/([0-9]{1,2})x([0-9]{2})/e',
'sprintf("S%02dE%02d", $1, $2)', $text);
echo $text;
?>
产量
Show.Name.S02E05.HDTV.x264
Show.Name.S02E06.HDTV.x264
Show.Name.S02E07.HDTV.x264
Show.Name.S02E00.HDTV.x264
Show.Name.S02E00.HDTV.x264
正如你所看到的,它把我的08和09变成00,我最好的猜测是这与PHP思维有关,我试图指出八进制,因为它是一个Base8系统,它只喜欢0到7。我不认为“字符串”中的前导零会表明这一点?如何更改代码以接受08和09,但不将它们更改为00?我试了几种方法试图逃离它,但我被卡住了。
最佳答案
目前你正在做的是:sprintf("S%02dE%02d", 2, 05)
这是使用八进制。您得到的是八进制结果,因为在解析数字之前,您需要将带前导零的数字视为字符串,而不是直接执行它们。因此,您所寻求的简单解决方案就是这样引用它们:
$text = preg_replace('/([0-9]{1,2})x([0-9]{2})/e',
'sprintf("S%02dE%02d", "$1", "$2")', $text);
或者,由于
e
标志已贬值,请尝试使用preg_replace_回调,这更易于使用:$text = preg_replace_callback('/([0-9]{1,2})[x]([0-9]{2})/',
function($matches){return sprintf("S%02dE%02d", $matches[1], $matches[2]);}
, $text);