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

标签 php preg-replace octal

<分区>

这可能是一个简单的,但我搜索后无法弄清楚。我设法以 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 认为我试图指示八进制有关,因为它是一个 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_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 - 我认为 PHP 将我的输入视为八进制,让它停止吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777320/

相关文章:

php - 单击 HTML 表格数据并插入到文本区域

php - CakePHP 2.4 - 数据库更新不保存所有传递的数据一个字段永远不会持久化

php - 删除除 "."以外的所有非单词字符

php - preg_replace() 模式删除 php 中的括号和内容

ruby - 如何使用整数中的前导零

r - getOc​​tD(x, offset, len) : invalid octal digit 中的错误

php - 优美的DOS命令错误处理

php - preg_replace 正则表达式删除杂散结束标记

Java int除法让我困惑

php - Javascript crc32 函数和 PHP crc32 不匹配