【问题标题】:Passing multiple backslashes in function argument not working在函数参数中传递多个反斜杠不起作用
【发布时间】:2018-02-23 16:17:50
【问题描述】:

这个

echo date('g:iA \o\n D, M jS', strtotime('2018-02-23 07:42:22'));

与此相呼应

7:42AM on Fri, Feb 23rd

但是这个

function dateformat($source, $format = "Y-m-d")
{
    if(empty($source) || $source == '0000-00-00') return false;
    $date = date($format, strtotime($source));
    if(date('Y', strtotime($date)) == '1969' && strpos($source, '1969') === false) return false;
    if(date('Y', strtotime($date)) == '1970' && strpos($source, '1970') === false) return false;
    return $date;
}
echo dateformat('2018-02-23 07:42:22', 'g:iA \o\n D, M jS');

与此相呼应

此时

echo dateformat('2018-02-23 07:42:22', "g:iA \o\n D, M jS");

与此相呼应

7:42AM o Fri, Feb 23rd

换句话说,使用单引号,我得到false 的返回值。使用双引号,函数参数正确传递 \o,但不是 \n

各种不同的测试都会产生不可预知的结果。我认为这与\n 被保留有关,所以我尝试\o\o 只是为了测试。这返回了false,而\o\n 成功通过了\o

我多年来一直以这种方式使用此功能,现在才注意到这个问题,所以我想这可能与我最近从 Dreamweaver 切换到 Visual Studio Code 有关,但我接受了这些测试到PHP Sandbox 并得到相同的结果,所以这不是代码编辑器的问题。

如果没有解决方案(这将是我的首选),是否至少可以解释导致这种行为的原因?

更新:总结主要问题,我不能将多个反斜杠字符传递给函数的参数。如果我这样做,它将返回 false。但是我想做的任何事情都可以在原生 php 日期函数中正常工作。

【问题讨论】:

  • 也许\n有某种特殊含义?
  • 不,我已经说过了。
  • 参见 OP 回复:\o\o 测试。
  • 您解决了在字符串中注入换行符,然后尝试通过 strtotime 运行它?
  • var_dump($date);exit; 在函数的第二行之后。你会看到它工作得很好。这是因为您在 date() 调用中删除了年份上下文,然后在结果上运行 strtotime()。另外,请不要对那些试图帮助你的人如此不屑一顾。任何时候有人说他们已经死了,确定某个问题不是某处,十分之九,猜猜问题出在哪里?

标签: php parameter-passing backslash


【解决方案1】:

对于单引号字符串,转义字符是文字​​\o\n,这会返回false,您的函数也是如此:

$date = date($format, strtotime($source));

对于双引号字符串,字符被转义,但是\n换行符 的转义序列,因此您得到的换行符不是n。在页面上做一个view source,你会看到:

7:42AM o
 Fri, Feb 23rd

要纠正这个问题,请使用双重转义:

"g:iA \o\\n D, M jS"

【讨论】:

  • 谢谢。你一直都是对的。但我需要的实际解决方案是不要将“on”这个词传递到函数的第三行和第四行。所以我需要在这些行上将 $date 更改为 $source 。所以如果你想更新你的答案,我会把它标记为正确的。
  • 原因是,我实际上并没有在我的代码中使用双引号。这是我在开始测试时为 SO 问题所做的事情,以显示不同的结果。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2010-10-18
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多