3

什么是 PHP 中的“贪婪令牌解析”?我在 Codeigniter 指南中发现了这一点:

“除非您需要解析变量,否则请始终使用单引号字符串,并且在确实需要解析变量的情况下,请使用大括号来防止贪婪的令牌解析。”

“我的字符串 {$foo}”

一个有很好解释的答案会有所帮助。

谢谢 !!

4

2 回答 2

6

贪婪令牌解析指的是这样的:

$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);

这完全取决于个人喜好,但您引用的指南中的重点是要小心您所写的内容。

于 2013-10-16T13:41:09.300 回答
3

“贪婪”是解析中的通用术语,指的是“尽可能多地获得”。相反的是“不贪婪”或“只得到你需要的东西”。

变量插值的区别是,例如:

$foo = 'bar';
echo "$foos";

这里的解析器会贪婪地解析尽可能多的东西,并尝试插入变量“ $foos”,而不是实际存在的变量“ $foo”。

正则表达式中的另一个例子:

preg_match('/.+\s/', 'foo bar baz')

这贪婪地抓住了“ foo bar”,因为它是符合模式的最长字符串.+\s。另一方面:

preg_match('/.+?\s/', 'foo bar baz')

这个不贪心+?只抓取“ foo”,这是匹配模式所需的最小值。

于 2013-10-16T13:45:48.497 回答