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

为什么三个双引号会在Windows命令提示符下给出PHP中的错误?,php,windows,console-application,Php,Windows,Console Application,从中我看到,要从命令行(不是从PowerShell,如果人们这么认为的话)在双引号字符串中只获得一个双引号,必须在一行中使用三个双引号。所以,直到最近,我一直在使用三个双引号,没有任何问题 C:\>php -r "echo '"""' . trim(trim(trim(trim(trim(42))))) . '"""';" )))) was unexpected at this time. C:\>php -r "echo '"""' . trim(trim(trim(trim(4

从中我看到,要从命令行(不是从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(+?)。PHP7.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 | """
我现在已经修复了批处理文件。详情如下:

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(+?)。PHP7.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 | """

我现在已经修复了批处理文件。此处的详细信息:

您需要这样:-
“echo”。""(trim)(trim(trim)(trim(trim)(trim(42()
php-r“echo”“”。修剪(42)。'"""';";在行尾添加另一个分号,这适用于me@YashKaranke这给了我同样的错误。为什么不以正确的方式转义双引号(
php-r“echo'\'”.trim(42)。“\'”;“//输出:“42”
)?顺便说一句,这使得代码可读性更好@YashKaranke web服务器并不重要,因为它是CLI,而不是CGI。我使用的是PHP7.3.9,奇怪的是,PHP7.1-7.3版本的行为是相同的,但PHP7.0是不同的!您需要这样:-
“echo”。""(trim)(trim(trim)(trim(trim)(trim(42()
php-r“echo”“”。修剪(42)。'"""';";在行尾添加另一个分号,这适用于me@YashKaranke这给了我同样的错误。为什么不以正确的方式转义双引号(
php-r“echo'\'”.trim(42)。“\'”;“//输出:“42”
)?顺便说一句,这使得代码可读性更好@YashKaranke web服务器并不重要,因为它是CLI,而不是CGI。我使用的是PHP7.3.9,奇怪的是,PHP7.1-7.3版本的行为是相同的,但PHP7.0是不同的!还有什么重要原因使您必须支持过时/不受支持的PHP版本?没有对PHP@CodyKL的官方支持,我使用的是PHP7.3,但我很好奇这种行为有多远。这是最近的事,还是过去10年或更长时间都是一样的?实验表明它是最新的,也就是说,它看起来像是PHP破坏了什么东西。那么,为什么您必须支持过时/不受支持的PHP版本呢?没有对PHP@CodyKL的官方支持,我使用的是PHP7.3,但我很好奇这种行为有多远。这是最近的事,还是过去10年或更长时间都是一样的?实验表明它是最近的,也就是说,它看起来像是PHP破坏了什么。