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

用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到底是如何工作的。

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


杨魅力
浏览 533回答 1
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你的新电话。
打开App,查看更多内容
随时随地看视频慕课网APP