PHP7 — модификатор /e больше не поддерживается, вместо этого используйте preg_replace_callback

Может ли кто-нибудь помочь мне с этой ошибкой, которую я получаю?

Предупреждение: 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


person kironet    schedule 18.03.2018    source источник
comment
Ваш модификатор e больше не имеет смысла в вашем коде preg_replace_callback(). Убери это. Затем return в foreach остановит цикл на первой итерации.   -  person Syscall    schedule 18.03.2018


Ответы (1)


В сообщении об ошибке вам предлагается удалить модификатор 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);
person HPierce    schedule 18.03.2018
comment
Совпадение всегда будет во втором элементе массива. - это первый (и единственный) элемент массива в случае OP, поскольку они не используют группы захвата. - person salathe; 18.03.2018
comment
@salathe, я не слежу. Я вижу пару () в ОП? Ни один код, представленный в OP, не имел бы смысла без группы захвата (которая полностью там). - person HPierce; 18.03.2018
comment
(?<=...) — это утверждение просмотра назад, а не группа захвата. - person salathe; 18.03.2018