PHP7 - /e修饰符不再被支持,使用preg_replace_callback代替

8

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

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

我的原始代码:

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

那么我试着这样做:

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

但我仍然得到相同的错误:

警告:preg_replace_callback():/e修饰符不再受支持,请使用preg_replace_callback代替


3
你的 preg_replace_callback() 代码中,e 修饰符已经没有意义了,可以去掉。另外,在 foreach 中使用 return 会在第一次迭代时停止循环。 - Syscall
1个回答

14

这个错误信息告诉你在你的新代码中删除你已经包含的e修饰符。

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

您需要删除修饰符,因此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);

“匹配项始终在数组的第二个项目中。” - 在 OP 的情况下,这是第一个(也是唯一的)数组项,因为他们没有使用捕获组。 - salathe
@salathe,我不明白。我在原始帖子中看到了一对 () 吗?如果没有捕获组(完全存在),原始帖子中提供的任何代码都没有意义。 - HPierce
2
(?<=...) 是一个后顾断言,而不是捕获组 - salathe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接