preg_replace_callback с массивом

Недавно я обновил свой сайт до PHP 5.6, и с тех пор я начал получать ошибки с модификатором e.

Вот функция, вызывающая проблему:

function blockPrepareDisplay() {
static $search = array('/(.)@(.)/se');
static $replace = array('"&#" .sprintf("%03d", ord("\\1")) .";@&#" .sprintf("%03d", ord("\\2")) . ";";');
$resarray = array();
foreach (func_get_args() as $var) {
    $var = htmlspecialchars($var, ENT_QUOTES);// Prepare var
    $var = preg_replace($search, $replace, $var);
    $var = preg_replace('/&#/', '&#', $var);
    $var = str_replace(" "," ",$var);
    $var = str_replace("&","&",$var);
    $resarray[] = $var;// Add to array
}
if (func_num_args() == 1) {// Return vars
    return $resarray[0];
} else {
    return $resarray;
  }
}

Я понимаю, что строка static $search = array('/(.)@(.)/se'); — это строка с модификатором e, и я знаю, что она устарела. Друг объяснил мне это и объяснил, что мне нужно заменить preg_replace на preg_replace_callback. Я просмотрел php.net и все здесь, но я думаю, что это сделало меня еще более запутанным, чем когда-либо.

Я пробовал в течение нескольких недель много разных вещей, и у меня есть одна, чтобы перестать выплевывать ошибку, но я уверен, что это неправильно, и я предпочитаю, чтобы это было правильно, чем неправильно. Я сделал это вместо preg_replace

$var = preg_replace_callback(
$search,
function($replace){
    foreach($replace as $replaces){
        return $replaces;
    }
}, 
$var
);

Вместо $var = preg_replace($search, $replace, $var);. Я также удалил модификатор e. Может ли кто-нибудь указать на мою ошибку и привести пример того, как я должен сделать это правильно?


person DaHax    schedule 09.09.2016    source источник


Ответы (1)


Аргументом функции обратного вызова является массив совпадающих групп.

Я не понимаю, почему вы используете массив для поиска и замены деталей, я бы сделал:

$var = "[email protected]";

$var = preg_replace_callback(
        '/(.)@(.)/',
        function($match) {
            return sprintf("&#%03d;@&#%03d;", ord($match[1]), ord($match[2]));
        },
        $var
    );
echo $var,"\n";

Вывод:

abc@def.org
person Toto    schedule 09.09.2016