Может ли кто-нибудь помочь мне с этой ошибкой, которую я получаю?
Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
Мой исходный код:
$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])));
Но я все еще получаю ту же ошибку:
Warning: preg_replace_callback(): The /e modifier is no longer supported, use preg_replace_callback instead






Сообщение об ошибке предлагает вам удалить модификатор 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, я не понимаю. В ОП вижу пару ()? Ни один из кодов, представленных в OP, не имел бы смысла без группы захвата (которая полностью присутствует).
(?<=...) - это утверждение назад, а не группа захвата.
Ваш модификатор
eбольше не имеет смысла в вашем кодеpreg_replace_callback(). Убери это. Затемreturnвforeachостановит цикл на первой итерации.