Bug #79044 [Com]: Curly Braces Throw T_LNUMBER Error

From: Date: Sun, 29 Dec 2019 23:10:49 +0000
Subject: Bug #79044 [Com]: Curly Braces Throw T_LNUMBER Error
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-224600@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=79044&edit=1

 ID:                 79044
 Comment by:         bugreports at gmail dot com
 Reported by:        thebluewalrus at gmail dot com
 Summary:            Curly Braces Throw T_LNUMBER Error
 Status:             Not a bug
 Type:               Bug
 Package:            *General Issues
 Operating System:   Mac OSX 10.12.4
 PHP Version:        7.4.1
 Block user comment: N
 Private report:     N

 New Comment:

irrelevant, the second one should throw the same error than the first and that can even throw at
compile time

php > echo $1test;
Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or
'{' or '$' in php shell code on line 1

php > echo "$1test";
$1test


Previous Comments:
------------------------------------------------------------------------
[2019-12-29 22:44:18] requinix@php.net

Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php

https://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

When PHP reads the simple syntax it sees the '$' and takes
> as many tokens as possible to form a valid variable name

No tokens means no variable and PHP ignores it.

Complex syntax works differently as it
> allows for the use of complex expressions

With complex syntax PHP sees '{$' and everything up to the closing '}' is used.
In other words, PHP looks for a valid expression - the kind you use in your regular code, but with
the obvious limitation that it has to start with a dollar sign.

"$1" is not a valid expression, and PHP raises the same syntax error that it would as if
you wrote that outside of a string.

------------------------------------------------------------------------
[2019-12-29 21:21:15] thebluewalrus at gmail dot com

Yes, I agree I would expect '"$1"' and '"{$1}"' to behave
the same but they don't. I think one or the other is functioning incorrectly. Simplifying the
"correct" example it still executes:

preg_replace('/(a)/', "$1", 'a');

------------------------------------------------------------------------
[2019-12-29 16:23:30] bugreports at gmail dot com

you can't have variables starting with a number in PHP

-----------------------

Correct behavior:
preg_replace('/(a)/', "$1test", 'a');

i would say this is not correct behavior and should trhow the same error becasue you can't have
a variable $1test nor can you have $1

-----------------------

php > $1test = 'test';

Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or
'{' or '$' in php shell code on line 1

------------------------------------------------------------------------
[2019-12-29 15:52:26] thebluewalrus at gmail dot com

Description:
------------
Using curly braces and a backreference in double quotes in regex replacement produces a
'T_LNUMBER' error for an invalid variable name. This behavior is inconsistent with other
behavior though, e.g. uncurled the "variable" doesn't throw parser error.

Test script:
---------------
Correct behavior:

preg_replace('/(a)/', "$1test", 'a');

Incorrect behavior:

preg_replace('/(a)/', "{$1}test", 'a');

Expected result:
----------------
In regex context this behaviors is incorrect because '{$3}' should produce '{capture
group three value}', as it does outside the curly braces.

Actual result:
--------------
Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or
'{' or '$'


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=79044&edit=1


Thread (9 messages)

« previous php.bugs (#224600) next »