【问题标题】:PHP preg_replace backreference causing undefined constant noticePHP preg_replace 反向引用导致未定义的常量通知
【发布时间】:2011-08-18 00:29:24
【问题描述】:

我正在尝试在code.google.com 上使用 NameCase 一个 php 类。当我运行它时,我收到了这个通知,但我不明白为什么。

PHP 注意:使用未定义的常量 Mc - 在 namecase.php(54) : 第 1 行的正则表达式代码

53   if( preg_match('/\bMac[A-Za-z]{2,}[^aciozj]\b/', $str) || preg_match('/\bMc/', $str) ) {
54     $str = preg_replace("/\b(Ma?c)([A-Za-z]+)/e", "$1.ucfirst('\\2')", $str);
55     // Now correct for "Mac" exceptions
56     $str = preg_replace('/\bMacEvicius/','Macevicius', $str); // Lithuanian
57     $str = preg_replace('/\bMacHado/',   'Machado', $str);    // Portuguese
58     $str = preg_replace('/\bMacHar/',    'Machar', $str);
59     ...

有什么办法可以纠正代码,使其不会产生通知。

谢谢

【问题讨论】:

    标签: php regex camelcasing


    【解决方案1】:

    您需要在替换时引用 $1,例如"'$1'.ucfirst('\\2')" 或更好,使用preg_replace_callback。在 PHP 5.3+ 中,您可以传递一个闭包,例如:

    $str = preg_replace_callback(
        "/\b(Ma?c)([A-Za-z]+)/",
        function($m) { return $m[1] . ucfirst($m[2]); },
        $str
    );
    

    【讨论】:

    • 在 5.3 之前,您已经可以使用 create_function() 传递闭包。可能不像 5.3+ 的闭包那样整洁和“干净”,但仍然如此。
    • 测试了这两种解决方案并完美运行!感谢您的快速回复。
    • 更正:我的意思当然是匿名函数,而不是闭包。
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多