【问题标题】:Why are three double quotes giving an error in PHP from the Windows command prompt?为什么在 Windows 命令提示符下,三个双引号会在 PHP 中给出错误?
【发布时间】:2019-11-27 05:40:32
【问题描述】:

this answer to a previous question 我看到,要从命令行(不是从 PowerShell,如果人们这么想的话)在双引号字符串中只得到一个双引号,就必须连续使用三个双引号。所以,直到最近,我一直使用三个双引号没有问题。

C:\>php -r "echo '"""' . trim(trim(trim(trim(trim(42))))) . '"""';"
)))) was unexpected at this time.

C:\>php -r "echo '"""' . trim(trim(trim(trim(42)))) . '"""';"
))) was unexpected at this time.

C:\>php -r "echo '"""' . trim(trim(trim(42))) . '"""';"
)) was unexpected at this time.

C:\>php -r "echo '"""' . trim(trim(42)) . '"""';"
) was unexpected at this time.

C:\>php -r "echo '"""' . trim(42) . '"""';"
. was unexpected at this time.

C:\>php -r "echo '"""' . '"""';"
""

为什么三个双引号在上面的例子中除了最后一个之外不起作用?

【问题讨论】:

  • 你需要这样:- "echo '" . trim(trim(trim(trim(trim(42))))) ."';";
  • php -r "echo '"""' . trim(42) . '"""';"; 在行尾添加另一个分号,这对我有用
  • @YashKaranke 这给了我同样的错误。
  • 为什么不以正确的方式转义双引号 (php -r "echo '\"' . trim(42) . '\"';" //output: "42")?这使得代码顺便说一句。可读性也更好!
  • @YashKaranke Web 服务器无关紧要,因为它是 CLI,而不是 CGI。我使用的是 PHP 7.3.9,奇怪的是,PHP 7.1-7.3 版本的行为相同,但 PHP 7.0 不同!

标签: php windows console-application


【解决方案1】:

TL;DR

PHP 正在通过一个批处理文件运行,该批处理文件正在破坏转义。


部分答案:

这是引起错误的引号字符串中的第一个右括号。从字符串中断开任意数量的连续括号可修复错误:

C:\>php -r "echo '"""' . trim(trim(trim(trim(42"))))" . '"""' . trim(trim(trim(13)));"
"42"13

注意42 之后的四个连续括号不在引号字符串中(因此不能有空格或出现不同的错误)。一旦找到另一个双引号,就不再需要断开右括号,例如第二组嵌套的trim() 函数。在开头添加第二个双引号需要以相反的方式处理括号:

C:\>php -r "echo '""""""' . trim(trim(trim(trim(42)))) . '"""' . trim(trim(trim(13")))";"
""42"13

这只适用于 PHP 7.1 到 7.3(+?) 版本。 PHP 7.0 及更早版本会报错。

从 PHP 5.4 到 7.0,三个双引号不起作用,你只能使用两个:

C:\>php70 -r "echo ' "" ' . trim(42) . ' "" ';"
 " 42 "
C:\>php54 -r "echo ' "" ' . trim(42) . ' "" ';"
 " 42 "
C:\>php70 -r "echo ' "" ' . trim(42) . ' "" ';"
 " 42 "
C:\>php71 -r "echo ' """ ' . trim(42")" . ' """ ';"
 " 42 "
C:\>php73 -r "echo ' """ ' . trim(42")" . ' """ ';"
 " 42 "

括号中的奇怪行为是通过批处理脚本运行 PHP 引起的。如果直接通过调用可执行文件运行,则行为不那么奇怪,尽管不同版本的 PHP 需要不同级别的双引号转义:

PHP | No. | "
---------------
5.0 |   3 | """
5.1 |   3 | """
5.2 |   3 | """
5.3 |   2 | ""
5.4 |   2 | ""
5.5 |   2 | ""
5.6 |   2 | ""
7.0 |   2 | ""
7.1 |   3 | """
7.2 |   3 | """
7.3 |   3 | """

我现在已经修复了批处理文件。详情在这里:Fix a batch script to handle closing parentheses inside an if block

【讨论】:

  • 您必须支持过时/不支持 PHP 版本的重要原因是什么? PHP
  • @CodyKL 我正在使用 PHP 7.3,但我很好奇这种行为可以追溯到多远。是最近的事情还是过去 10 年或更长时间都一样?实验表明它是最近的,即看起来 PHP 破坏了一些东西。
猜你喜欢
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
相关资源
最近更新 更多