Переход от «preg_replace()» к «preg_replace_callback()»

84
26 ноября 2019, 12:00

Нужна помощь с переписыванием preg_replace в preg_replace_callback:

$send_mess = preg_replace("/private \[(.*)\]/Ue","'<span class=user-to-private data=\"'.(('\\1' != '" . $user['login'] . "')?'\\1':'" . $send_login ."').'\">private [</span><span class=user-to-private name=\"\\1\" data=\"'.(('\\1' != '". $user['login'] . "')?'\\1':'" . $send_login ."').'\">\\1</span><span class=user-to-private data=\"'.(('\\1' != '". $user['login'] . "')?'\\1':'" . $send_login ."').'\">]</span>'", $send_mess);

P.S. Мануалы читал, но ничего не вышло. Заранее благодарю.

Answer 1

строка взята из работающего проекта под пхп5.4. пхп7.2 ругается на модификатор /e и не выполняет этот код. именно из за этого нужно использовать preg_replace_callback

На preg_replace_callback() код будет выглядеть так:

$send_mess = preg_replace_callback(
    '~private \[(.*?)\]~',
    function ($m) use (&$user, &$send_login){
        return '<span class=user-to-private data="'
            . ($m[1] != $user['login'] ? $m[1] : $send_login)
            . '">private [</span><span class=user-to-private name="'
            . $m[1] . '" data="' . ($m[1] != $user['login'] ? $m[1] : $send_login)
            . '">' . $m[1] . '</span><span class=user-to-private data="'
            . ($m[1] != $user['login'] ? $m[1] : $send_login) . '">]</span>';
    },
    $send_mess
);
echo $send_mess;

Возвращает он такую же строку, как и ваш аналог. Ну а раз вы говорите, что так и надо, то так и будет. Хотя конечно прочитать такой код не реально.

Answer 2

Необходимые данные:

$user['login'] = 'Юзер_Логин';
$send_login = 'Логин';
$send_mess = 'private [что-то]';

Сама переписанная конструкция:

$send_mess = preg_replace_callback(
    '/private \[(.*)]/U',
    function ($call) use ($user, $send_login)
    {
        $logic = $call[1] != $user['login'] ? $call[1] : $send_login;
        return "
            <span class=user-to-private data=\"{$logic}\">private [</span>
            <span class=user-to-private name=\"{$call[1]}\" data=\"{$logic}\">{$call[1]}
            </span><span class=user-to-private data=\"{$logic}\">]</span>
        ";
    },
    $send_mess
);
READ ALSO
Не выводиться запись из бд типу Varchar

Не выводиться запись из бд типу Varchar

Не выводиться запись из бд типу VarcharОтправляю через AJAX запрос в бд, в ответ получаю пустой запрос, но если сделаю выборку и закоментирую некоторое...

80
Поиск с PDO и с помощью Prepard Statements

Поиск с PDO и с помощью Prepard Statements

Допустим, я хочу сделать поискЭтот код ищет 2 или 3 заданых слова одновременно, это хорошо, так и задумано

140
Зачем нужны абстрактные классы?

Зачем нужны абстрактные классы?

Какую роль в этом коде (из книги) играют абстрактные классы?

110
Как передать blob на сервер и записать их?

Как передать blob на сервер и записать их?

Пример брал отсюдаПомогите реализовать сохранение файла конкретно на сервере в автоматическом режиме, а не сохранение файла на компьютер...

120