Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用preg_Replace_回调替换preg_Replace()e修饰符_Php_Regex_Preg Replace_Preg Replace Callback - Fatal编程技术网

Php 用preg_Replace_回调替换preg_Replace()e修饰符

Php 用preg_Replace_回调替换preg_Replace()e修饰符,php,regex,preg-replace,preg-replace-callback,Php,Regex,Preg Replace,Preg Replace Callback,我对正则表达式很在行。我正在尝试替换这个: public static function camelize($word) { return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word); } 使用preg_将_回调替换为匿名函数。我不明白\\2正在做什么。或者就这一点而言,preg_replace_回调是如何工作的 实现这一点的正确代码是什么?在正则表达式中,您可以使用(括号)“捕获”匹配字符串的部分;在本例中,您

我对正则表达式很在行。我正在尝试替换这个:

public static function camelize($word) {
   return preg_replace('/(^|_)([a-z])/e', 'strtoupper("\\2")', $word);
}
使用preg_将_回调替换为匿名函数。我不明白\\2正在做什么。或者就这一点而言,preg_replace_回调是如何工作的


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

在正则表达式中,您可以使用
(括号)
“捕获”匹配字符串的部分;在本例中,您将捕获匹配的
(^ |)
([a-z])
部分。这些都是从1开始编号的,所以您有后面的引用1和2。匹配0是整个匹配字符串

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

preg\u replace\u callback
函数取而代之的是一个回调函数,并向其传递一个包含匹配的反向引用的数组。因此,在编写
'\\1'
的地方,您可以访问该参数的元素1-例如,如果您有一个形式为
函数($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
不是神奇的名称,它们只是我在声明回调函数时给出的参数名称。此外,您不必传递匿名函数,它可以是作为字符串的函数名,也可以是
数组($object,$method)
的形式,例如

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

'do_stuff(\\1, $foo)'
那么新的回调可能看起来像

function($m) use ($foo) { return do_stuff($m[1], $foo); }
戈查斯
  • 使用
    preg\u replace\u callback
    代替正则表达式上的
    /e
    修饰符,因此需要从“pattern”参数中删除该标志。所以像
    /blah(.*)blah/mei
    这样的模式将变成
    /blah(.*)blah/mi
  • /e
    修饰符在参数内部使用了一个变量
    addslashes()
    ,因此一些替换使用了
    stripslashes()
    来删除它;在大多数情况下,您可能希望从新回调中删除对
    stripslashes
    的调用

在正则表达式中,您可以使用
(括号)
“捕获”匹配字符串的部分;在本例中,您将捕获匹配的
(^ |)
([a-z])
部分。这些都是从1开始编号的,所以您有后面的引用1和2。匹配0是整个匹配字符串

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

preg\u replace\u callback
函数取而代之的是一个回调函数,并向其传递一个包含匹配的反向引用的数组。因此,在编写
'\\1'
的地方,您可以访问该参数的元素1-例如,如果您有一个形式为
函数($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
不是神奇的名称,它们只是我在声明回调函数时给出的参数名称。此外,您不必传递匿名函数,它可以是作为字符串的函数名,也可以是
数组($object,$method)
的形式,例如

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

'do_stuff(\\1, $foo)'
那么新的回调可能看起来像

function($m) use ($foo) { return do_stuff($m[1], $foo); }
戈查斯
  • 使用
    preg\u replace\u callback
    代替正则表达式上的
    /e
    修饰符,因此需要从“pattern”参数中删除该标志。所以像
    /blah(.*)blah/mei
    这样的模式将变成
    /blah(.*)blah/mi
  • /e
    修饰符在参数内部使用了一个变量
    addslashes()
    ,因此一些替换使用了
    stripslashes()
    来删除它;在大多数情况下,您可能希望从新回调中删除对
    stripslashes
    的调用

一般情况下,不应使用标志
e
(或
eval

你也可以使用


一般情况下,不应使用标志
e
(或
eval

你也可以使用

preg_用eval支架更换垫片 这是非常不可取的。但是如果你不是程序员,或者你真的喜欢糟糕的代码,你可以使用一个替代的
preg\u replace
函数来暂时保持你的
/e
标志工作

\n”; } 请记住,仅仅是复制和粘贴并不是编程。您必须使生成的代码适应您的需要