我对正则表达式很在行.我试图取代这个:

public static function camelize($word) {
   return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word);
}

使用preg_,将_回调替换为匿名函数.我不明白\\2在做什么.或者说preg_replace_回调是如何工作的.

实现这一目标的正确代码是什么?

推荐答案

在正则表达式中,您可以使用(brackets)"捕获"匹配字符串的部分;在本例中,您捕获的是匹配的(^|_)([a-z])部分.这些字符串从1开始编号,因此您有反向引用1和2.Match 0是整个匹配的字符串.

/e修饰符接受替换字符串,并用适当的反向引用替换反斜杠后跟数字(例如\1)-但是因为您在字符串内,所以需要转义反斜杠,因此得到'\\1'.然后它(有效地)运行eval来运行结果字符串,就像它是PHP代码一样(这就是它被弃用的原因,因为它很容易以不安全的方式使用eval).

preg_replace_callback函数取而代之的是一个回调函数,并向其传递一个包含匹配的反向引用的array.因此,在编写'\\1'的地方,您可以访问该参数的元素1——例如,如果您有一个function($matches) { ... }形式的匿名函数,那么该函数中的第一个反向引用是$matches[1].

所以/e个论点是

'do_stuff(\\1) . "and" . do_stuff(\\2)'

可能会成为

function($m) { return do_stuff($m[1]) . "and" . do_stuff($m[2]); }

还是你的情况

'strtoupper("\\2")'

可能会变成

function($m) { return strtoupper($m[2]); }

注意$m$matches不是神奇的名字,它们只是我在声明回调函数时给出的参数名.此外,您不必传递匿名函数,它可以是一个函数名,比如字符串,或者是array($object, $method)as with any callback in PHP等形式的函数名.

function stuffy_callback($things) {
    return do_stuff($things[1]) . "and" . do_stuff($things[2]);
}
$foo = preg_replace_callback('/([a-z]+) and ([a-z]+)/', 'stuffy_callback', 'fish and chips');

与任何函数一样,默认情况下,您不能访问回调之外的变量(从周围的范围).使用匿名函数时,可以使用use关键字导入需要访问的变量as discussed in the PHP manual.e、 g.如果旧的论点是正确的

'do_stuff(\\1, $foo)'

那么,新的回调可能看起来像

function($m) use ($foo) { return do_stuff($m[1], $foo); }

Gotchas

  • preg_replace_callback是正则表达式上的/e修饰符,所以需要从"pattern"参数中删除该标志.所以像/blah(.*)blah/mei这样的模式会变成/blah(.*)blah/mi.
  • /e修饰符在内部对参数使用了addslashes()的变体,因此一些替换使用stripslashes()来删除它;在大多数情况下,您可能希望从新回调中删除对stripslashes的调用.

Php相关问答推荐

输入手写CSV时在PHP中进行日期判断

PHP DOMDocument忽略第一个表S结束标记

PHP cUrl扩展与v8.2.12更新损坏

从产品中获取WooCommerce产品属性单选按钮的列表WP_Query

将客户重定向到自定义感谢页后的空白页

如何确保所有语言文件都使用Laravel中的新密钥进行更新?

这是在可召回的背景下吗?

如何在汇总表构建器中操作LALAVEL细丝Sum::Make()值

基于自定义域的每个购物车项目的WooCommerce定制数量输入步骤

Laravel 10中的Validator类

Laravel 10.x在到达控制器之前将查询参数强制转换为正确的类型

如何批量处理消息总线中的消息

当未 Select 任何变体时,在 WooCommerce 可变产品上显示自定义文本

WordPress 分页无法正常工作

根据页面的最后修订日期设置 MediaWiki 内部链接的样式

PHP 中的curl -F request=@file.xml

URL中包含"&"与DirectoryIterator不兼容

设置GA4 PHP API的setSubject以允许访问所有管理员账户属性

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

如果 static:: 被解析为B,为什么 PHP 会执行A的方法