这可能很简单,但搜索后我无法弄明白。我设法改变输出20种不同的方式,但它们都不是我想要的东西= D
<?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思考有关我试图指出八进制,因为它是一个它只喜欢0-7的base8系统。我不认为“字符串”中的前导零会表明这一点吗?如何更改我的代码以接受08和09但不能将它们更改为00?我尝试了几种方法试图逃避它,但我被卡住了。
答案 0 :(得分:3)
请使用preg_replace_callback
尝试此操作 - 因为e
的{{1}}修饰符现在已经被删除了 - str_pad
:
preg_replace
输出是:
$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_callback('/([0-9]{1,2})x([0-9]{2})/', function($matches) {
return 'S'.(str_pad($matches[1], 2, 0, STR_PAD_LEFT)).'E'.(str_pad($matches[2], 2, 0, STR_PAD_LEFT));
}, $text);
echo '<pre>';
echo $text;
echo '</pre>';
答案 1 :(得分:3)
目前您正在做的是: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_callback:
$text = preg_replace_callback('/([0-9]{1,2})[x]([0-9]{2})/',
function($matches){return sprintf("S%02dE%02d", $matches[1], $matches[2]);}
, $text);
答案 2 :(得分:1)
保持代码
<?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", ltrim($1,\'.\', ltrim($2,\'x\'))', $text);
echo $text;
?>
作品
但正如其他人所建议的那样,/e
修饰符已弃用。
发生这种情况的原因是$2
(以及$ 1,但在示例中没有看到)变量以0
开头并被视为来自php手册的八进制
http://www.php.net/manual/en/language.types.integer.php
编辑:Ultimater答案要好得多