我很讨厌正则表达式。我正在尝试替换为:
public static function camelize($word) { return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word); }
与带有匿名函数的preg_replace_callback一起使用。我不知道\\ 2在做什么。或就此而言,preg_replace_callback的工作方式完全一样。
实现该目标的正确代码是什么?
在正则表达式中,您可以使用(brackets); 来“捕获”匹配字符串的部分。在这种情况下,您正在捕获匹配的(^|_)和([a-z])部分。这些从1开始编号,因此您具有后向引用1和2。匹配项0是整个匹配的字符串。
(brackets)
(^|_)
([a-z])
该/e调节器将替换字符串,以及替代反斜线后面的数字(例如\1)用适当的反向参考- 而是因为你是一个字符串中,你需要转义反斜线,让您得到'\\1'。然后(有效地)运行eval运行结果字符串,就好像它是PHP代码一样(这就是为什么不赞成使用它的原因,因为它很容易以eval不安全的方式使用)。
/e
\1
'\\1'
eval
该preg_replace_callback函数将采用回调函数,并将包含匹配的反向引用的数组传递给该函数。因此,您将在编写该代码的地方'\\1'访问该参数的元素1-例如,如果您具有形式的匿名函数function($matches) { ... },则第一个向后引用$matches[1]在该函数内部。
preg_replace_callback
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中的任何回调,如
$m
$matches
array($object,$method)
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手册中所述。例如,如果旧的论点是
use
'do_stuff(\\1, $foo)'
那么新的回调可能看起来像
function($m) use ($foo) { return do_stuff($m[1], $foo); }
/blah(.*)blah/mei
/blah(.*)blah/mi
addslashes()
stripslashes()
stripslashes