PHP7 - 不再支持 /e 修饰符,请改用 preg_replace_callback

kir*_*net 4 php preg-replace preg-replace-callback

有人可以帮我解决这个错误吗?

警告:preg_replace():不再支持 /e 修饰符,请改用 preg_replace_callback

我的原始代码:

$match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
Run Code Online (Sandbox Code Playgroud)

所以我这样试过:

$match[1] = preg_replace_callback('/(?<=^|[\x09\x20\x2D])./e',
                    function ($matches) {
                        foreach ($matches as $match) {
                            return strtoupper($match);
                        }
                    },
                    strtolower(trim($match[1])));
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误:

警告:preg_replace_callback():不再支持 /e 修饰符,请改用 preg_replace_callback

HPi*_*rce 9

错误消息告诉您删除e已包含在新代码中的修饰符。

/ (?<=^|[\x09\x20\x2D]). / e
^ ^------Pattern-------^ ^ ^ ---- Modifiers
|                        |
 -------Delimiters-------
Run Code Online (Sandbox Code Playgroud)

您需要删除修饰符,因此preg_replace_callback('/(?<=^|[\x09\x20\x2D])./e', ...)应该删除preg_replace_callback('/(?<=^|[\x09\x20\x2D])./' , ...).

顺便说一句,您不会从foreach在新代码中使用循环中受益。匹配项将始终位于数组的第二项中。这是一个不使用循环的示例:

$inputString = 'foobazbar';

$result = preg_replace_callback('/^foo(.*)bar$/', function ($matches) {
     // $matches[0]: "foobazbar" 
     // $matches[1]: "baz" 
     return "foo" . strtoupper($matches[1]) . "bar";
}, $inputString);

// "fooBAZbar"
var_dump($result);
Run Code Online (Sandbox Code Playgroud)

  • `(?&lt;=...)` 是 [lookbehind assertion](https://www.regular-expressions.info/lookaround.html),而不是 [捕获组](https://www.regular- expression.info/brackets.html)。 (2认同)