繁体   English   中英

为什么三个双引号在 Windows 命令提示符下给出 PHP 错误?

[英]Why are three double quotes giving an error in PHP from the Windows command prompt?

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 '"""' . '"""';"
""

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

TL; 博士

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 | """

我现在已经修复了批处理文件。 此处的详细信息:修复批处理脚本以处理 if 块内的右括号

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM