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