为了账号安全,请及时绑定邮箱和手机立即绑定

用preg_替换_callback替换preg_替换()e修饰符

/ 猿问

用preg_替换_callback替换preg_替换()e修饰符

杨魅力 2019-05-31 10:58:20

用preg_替换_callback替换preg_替换()e修饰符

我不擅长正则表达式。我在试着替换这个:

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

使用带有匿名函数的preg_reve_callback。我不明白\2在做什么。或者,对于这个问题,preg_reve_callback到底是如何工作的。

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


查看完整描述

1 回答

?
汪汪一只猫

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

这个/e修饰符接受一个替换字符串,并替换反斜杠,后面跟着一个数字(例如,\1)使用适当的反向引用-但是由于您在字符串中,需要转义反斜杠,所以'\\1'。然后(实际上)运行eval以PHP代码的形式运行生成的字符串(这就是不推荐它的原因,因为它易于使用eval(以一种不安全的方式)。

这个preg_replace_callback函数将接受回调函数,并将其传递给包含匹配的回退引用的数组。所以你会在哪里写'\\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)与PHP中的任何回调一样,G.

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关键字导入需要访问的变量,正如PHP手册中所讨论的那样。如果旧的论点是

'do_stuff(\\1, $foo)'

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

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

格查斯

  • 使用

    preg_replace_callback

    而不是

    这个

    /e

    正则表达式上的修饰符,因此您需要从“模式”参数中移除该标志。所以像这样的模式

    /blah(.*)blah/mei

    会变成

    /blah(.*)blah/mi.

  • 这个

    /e

    修饰语使用的变体

    addslashes()

    内部的参数,所以一些替换使用

    stripslashes()

    若要删除它;在大多数情况下,您可能希望删除对

    stripslashes

    你的新电话。


查看完整回答
反对 回复 2019-05-31

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信