【问题标题】:'Greedy Token Parsing' in PHPPHP中的“贪婪令牌解析”
【发布时间】:2013-10-16 13:37:03
【问题描述】:

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

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

"我的字符串 {$foo}"

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

谢谢!!

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        相关资源
        最近更新 更多