【发布时间】:2013-10-16 13:37:03
【问题描述】:
什么是 PHP 中的“贪婪令牌解析”? 我在 Codeigniter 指南中发现了这一点:
“除非您需要解析变量,否则请始终使用单引号字符串,并且在确实需要解析变量的情况下,请使用大括号来防止贪婪令牌解析。”
"我的字符串 {$foo}"
一个有很好解释的答案会有所帮助。
谢谢!!
【问题讨论】:
标签: php codeigniter
什么是 PHP 中的“贪婪令牌解析”? 我在 Codeigniter 指南中发现了这一点:
“除非您需要解析变量,否则请始终使用单引号字符串,并且在确实需要解析变量的情况下,请使用大括号来防止贪婪令牌解析。”
"我的字符串 {$foo}"
一个有很好解释的答案会有所帮助。
谢谢!!
【问题讨论】:
标签: php codeigniter
贪婪令牌解析指的是这样的:
$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”,这是匹配模式所需的最小值。
【讨论】: