编程语言
首页 > 编程语言> > 我认为PHP将我的输入视为八进制,让它停止?

我认为PHP将我的输入视为八进制,让它停止?

作者:互联网

参见英文答案 > Understanding str_pad() with leading zeros                                    1个
这可能是一个简单的,但我搜索后无法弄明白.我设法改变输出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的思考有关我正在试图指出八进制,因为它是一个基本的8系统,它只喜欢0-7.我不认为“字符串”中的前导零会表明这一点吗?如何更改我的代码以接受08和09但不能将它们更改为00?我尝试了几种尝试逃避它的方法,但我被卡住了.

解决方法:

目前你正在做的是:使用八进制的sprintf(“S?dE?d”,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);

标签:php,preg-replace,octal
来源: https://codeday.me/bug/20190728/1564323.html