diff --git a/src/Illuminate/View/Compilers/BladeCompiler.php b/src/Illuminate/View/Compilers/BladeCompiler.php index d6e55ef4d965..44fee39a0c10 100644 --- a/src/Illuminate/View/Compilers/BladeCompiler.php +++ b/src/Illuminate/View/Compilers/BladeCompiler.php @@ -401,7 +401,7 @@ protected function compileEscapedEchos($value) */ public function compileEchoDefaults($value) { - return preg_replace('/^(?=\$)(.+?)(?:\s+or\s+)(.+?)$/s', 'isset($1) ? $1 : $2', $value); + return preg_replace('/^(\$.+(?:\[[\'"].+[\'"]\])|[^\[\]\'"]*)(?:\s+or\s+)(.+)$/s', 'isset($1) ? $1 : $2', $value); } /** diff --git a/tests/View/ViewBladeCompilerTest.php b/tests/View/ViewBladeCompilerTest.php index f824df73c13b..7c69980c41f2 100644 --- a/tests/View/ViewBladeCompilerTest.php +++ b/tests/View/ViewBladeCompilerTest.php @@ -98,6 +98,97 @@ public function testEchosAreCompiled() $this->assertEquals("\n\n", $compiler->compileString("{{ \$name }}\n")); $this->assertEquals("\r\n\r\n", $compiler->compileString("{{ \$name }}\r\n")); + $this->assertEquals('', $compiler->compileString('{{{$name["key"]}}}')); + $this->assertEquals('', $compiler->compileString('{{$name["key"]}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["key"] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["key"] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["key with space"]}}}')); + $this->assertEquals('', $compiler->compileString('{{$name["key with space"]}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["key with space"] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["key with space"] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name[\'key\']}}}')); + $this->assertEquals('', $compiler->compileString('{{$name[\'key\']}}')); + $this->assertEquals('', $compiler->compileString('{{ $name[\'key\'] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name[\'key\'] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name[\'key with space\']}}}')); + $this->assertEquals('', $compiler->compileString('{{$name[\'key with space\']}}')); + $this->assertEquals('', $compiler->compileString('{{ $name[\'key with space\'] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name[\'key with space\'] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name[\'key or space\']}}}')); + $this->assertEquals('', $compiler->compileString('{{$name[\'key or space\']}}')); + $this->assertEquals('', $compiler->compileString('{{ $name[\'key or space\'] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name[\'key or space\'] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["key or space"]}}}')); + $this->assertEquals('', $compiler->compileString('{{$name["key or space"]}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["key or space"] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["key or space"] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["key"] or "foo"}}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["key"] or "foo" }}')); + $this->assertEquals('', $compiler->compileString('{{$name["key"] or "foo"}}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["key"] or "foo" + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["key or space"] or "foo"}}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["key or space"] or "foo" }}')); + $this->assertEquals('', $compiler->compileString('{{$name["key or space"] or "foo"}}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["key or space"] or "foo" + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["key \' or \' space"] or "foo"}}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["key \' or \' space"] or "foo" }}')); + $this->assertEquals('', $compiler->compileString('{{$name["key \' or \' space"] or "foo"}}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["key \' or \' space"] or "foo" + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name[\'key " or " space\']}}}')); + $this->assertEquals('', $compiler->compileString('{{$name[\'key " or " space\']}}')); + $this->assertEquals('', $compiler->compileString('{{ $name[\'key " or " space\'] }}')); + $this->assertEquals('', $compiler->compileString('{{ + $name[\'key " or " space\'] + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["a"]["b"] or "foo"}}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["a"]["b"] or "foo" }}')); + $this->assertEquals('', $compiler->compileString('{{$name["a"]["b"] or "foo"}}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["a"]["b"] or "foo" + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["a or b"]["c"] or "foo"}}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["a or b"]["c"] or "foo" }}')); + $this->assertEquals('', $compiler->compileString('{{$name["a or b"]["c"] or "foo"}}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["a or b"]["c"] or "foo" + }}')); + + $this->assertEquals('', $compiler->compileString('{{{$name["a"]["b or c"] or "foo"}}}')); + $this->assertEquals('', $compiler->compileString('{{ $name["a"]["b or c"] or "foo" }}')); + $this->assertEquals('', $compiler->compileString('{{$name["a"]["b or c"] or "foo"}}')); + $this->assertEquals('', $compiler->compileString('{{ + $name["a"]["b or c"] or "foo" + }}')); + $this->assertEquals('', $compiler->compileString('{{ $name or "foo" }}')); $this->assertEquals('name) ? $user->name : "foo"); ?>', $compiler->compileString('{{ $user->name or "foo" }}')); $this->assertEquals('', $compiler->compileString('{{$name or "foo"}}'));