Bug #79044 [Com]: Curly Braces Throw T_LNUMBER Error
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)