什么是 PHP 中的“贪婪令牌解析”?我在 Codeigniter 指南中发现了这一点:
“除非您需要解析变量,否则请始终使用单引号字符串,并且在确实需要解析变量的情况下,请使用大括号来防止贪婪的令牌解析。”
“我的字符串 {$foo}”
一个有很好解释的答案会有所帮助。
谢谢 !!
什么是 PHP 中的“贪婪令牌解析”?我在 Codeigniter 指南中发现了这一点:
“除非您需要解析变量,否则请始终使用单引号字符串,并且在确实需要解析变量的情况下,请使用大括号来防止贪婪的令牌解析。”
“我的字符串 {$foo}”
一个有很好解释的答案会有所帮助。
谢谢 !!
贪婪令牌解析指的是这样的:
$fruit = "apple";
$amount = 3;
$string = "I have $amount $fruits";
可能的预期输出:“我有 3 个苹果”
实际输出:“我有 3 个”
当然,这是初学者的错误,但即使是专家也有时会犯错误!
就个人而言,我根本不喜欢插入变量,大括号与否。我发现我的代码更具可读性,如下所示:
$string = "I have ".$amount." ".$fruit."s";
请注意,代码编辑器对此行进行颜色编码更容易,如 Notepad++ 中所示:
再说一次,有些人可能更喜欢让引擎进行插值:
$string = sprintf("I have %d %ss",$amount,$fruit);
这完全取决于个人喜好,但您引用的指南中的重点是要小心您所写的内容。
“贪婪”是解析中的通用术语,指的是“尽可能多地获得”。相反的是“不贪婪”或“只得到你需要的东西”。
变量插值的区别是,例如:
$foo = 'bar';
echo "$foos";
这里的解析器会贪婪地解析尽可能多的东西,并尝试插入变量“ $foos
”,而不是实际存在的变量“ $foo
”。
正则表达式中的另一个例子:
preg_match('/.+\s/', 'foo bar baz')
这贪婪地抓住了“ foo bar
”,因为它是符合模式的最长字符串.+\s
。另一方面:
preg_match('/.+?\s/', 'foo bar baz')
这个不贪心+?
只抓取“ foo
”,这是匹配模式所需的最小值。