codeigniter PHP中的“贪婪令牌解析”是什么?

qacovj5a  于 2023-05-04  发布在  PHP
关注(0)|答案(2)|浏览(99)

什么是PHP中的“贪婪令牌解析”?我在Codeigniter指南中发现了这一点:
除非需要解析变量,否则始终使用单引号字符串;如果确实需要解析变量,请使用大括号以防止贪婪令牌解析
“我的字符串{$foo}”
一个好的解释会有帮助。

toe95027

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

这完全取决于个人喜好,但你引用的指导方针中的一点是要小心你所写的东西。

ymdaylpp

ymdaylpp2#

“贪婪”是解析中的一个通用术语,指的是“尽可能多地获取”。相反的是“不贪婪”或“只得到你需要的”。
变量插值的差异是,例如:

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

这里的解析器将贪婪地解析尽可能多的有意义的内容,并尝试插入变量“$foos”,而不是实际存在的变量“$foo”。
正则表达式的另一个例子:

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

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

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

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

相关问题