preg_replace Модификатор / e устарел с использованием массивов в качестве шаблона и замены

Раньше у меня был этот блок кода для имитации своего рода BBCode:

$pattern = array(
'/\\n/',
'/\\r/',
'/\[list\](.*?)\[\/list\]/ise',
'/\[b\](.*?)\[\/b\]/is',
'/\[strong\](.*?)\[\/strong\]/is',
'/\[i\](.*?)\[\/i\]/is',
'/\[u\](.*?)\[\/u\]/is',
'/\[s\](.*?)\[\/s\]/is',
'/\[del\](.*?)\[\/del\]/is',
'/\[url=(.*?)\](.*?)\[\/url\]/ise',
'/\[email=(.*?)\](.*?)\[\/email\]/is',
'/\[img](.*?)\[\/img\]/ise',
'/\[color=(.*?)\](.*?)\[\/color\]/is',
'/\[font=(.*?)\](.*?)\[\/font\]/ise',
'/\[bg=(.*?)\](.*?)\[\/bg\]/ise',
'/\[size=(.*?)\](.*?)\[\/size\]/ise'
);

$replace = array(
'<br/>',
'',
'$this->sList(\'\\1\')',
'<b>\1</b>',
'<strong>\1</strong>',
'<i>\1</i>',
'<span style="text-decoration: underline;">\1</span>',
'<span style="text-decoration: line-through;">\1</span>',
'<span style="text-decoration: line-through;">\1</span>',
'$this->urlfix(\'\\1\',\'\\2\')',
'<a href="mailto:\1" title="\1">\2</a>',
'$this->imagefix(\'\\1\')',
'<span style="color: \1;">\2</span>',
'$this->fontfix(\'\\1\',\'\\2\')',
'$this->bgfix(\'\\1\',\'\\2\')',
'$this->sizefix(\'\\1\',\'\\2\')'
);

return preg_replace($pattern, $replace, nl2br(stripslashes($string)));

Но я перехожу на PHP 5.5, и здесь я получаю ошибки, раньше он работал отлично, вот ошибки, которые я получаю:

Не рекомендуется: preg_replace (): модификатор / e устарел, используйте
вместо preg_replace_callback в

Я пробовал несколько вещей, но пока ничего не получалось.

Это код, который я пробовал до сих пор:

return preg_replace_callback(
$pattern,
function($matches) use ($replace) {
return ((isset($replace[$matches[0]])) ? $replace[$matches[0]] : '');
},
nl2br(stripslashes($string))
);

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

пожалуйста уведомление что есть некоторые методы, которые вызываются из области $ replace.

Как я могу решить это? Это правильный подход?

3

Решение

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

Вот мой решение заменить BB-коды:

$bbcodes    = [
'/\\n/' => '$this->setLineJump()',
'/\\r/' => '$this->setReturn()',
'/\[list\](.*?)\[\/list\]/is' => '$this->setList(\'\\1\')',
'/\[b\](.*?)\[\/b\]/is' => '$this->setBold(\'\\1\')',
'/\[strong\](.*?)\[\/strong\]/is' => '$this->setBold(\'\\1\')',
'/\[i\](.*?)\[\/i\]/is' => '$this->setItalic(\'\\1\')',
'/\[u\](.*?)\[\/u\]/is' => '$this->setUnderline(\'\\1\')',
'/\[s\](.*?)\[\/s\]/is' => '$this->setStrike(\'\\1\')',
'/\[del\](.*?)\[\/del\]/is' => '$this->setStrike(\'\\1\')',
'/\[url=(.*?)\](.*?)\[\/url\]/is' => '$this->setUrl(\'\\1\',\'\\2\')',
'/\[email=(.*?)\](.*?)\[\/email\]/is' => '$this->setEmail(\'\\1\',\'\\2\')',
'/\[img](.*?)\[\/img\]/is' => '$this->setImage(\'\\1\')',
'/\[color=(.*?)\](.*?)\[\/color\]/is' => '$this->setFontColor(\'\\1\',\'\\2\')',
'/\[font=(.*?)\](.*?)\[\/font\]/is' => '$this->setFontFamiliy(\'\\1\',\'\\2\')',
'/\[bg=(.*?)\](.*?)\[\/bg\]/is' => '$this->setBackgroundColor(\'\\1\',\'\\2\')',
'/\[size=(.*?)\](.*?)\[\/size\]/is' => '$this->setFontSize(\'\\1\',\'\\2\')'
];

$string = stripslashes($string);

foreach ($bbcodes as $bbcode => $html) {
$string = preg_replace_callback(
$bbcode,
function($matches) use($html) {
return $this->getBbCode($matches, $html);
},
$string
);
}

private function getBbCode($matches, $replace)
{
if (isset($matches[1])) {

$replacements   = [
'\1' => isset($matches[1]) ? $matches[1] : '',
'\2' => isset($matches[2]) ? $matches[2] : ''
];

return eval('return ' . strtr($replace, $replacements) . ';');
} else {

return eval('return ' . $replace . ';');
}
}

Как вы можете видеть, я использую объекты, но вы можете заменить их своими собственными функциями. Здесь действительно важно то, что вы можете заменить элемент на элемент, просто внеся некоторые изменения в свои массивы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector