работаете с функцией preg_replace_callback подряд несколько раз? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь пометить функцию preg_replace_callback по-разному в одной строке

$textline = "[italic] Hello *Bold*!\n";
$textline .= "[true] Yes *Haaa*, you are *super*\n";
function italic($treffer) { 
 return '<i>'.$treffer[1].'</i>';
}
function bold($treffer) {
 return '<b>'.$treffer[1].'</b>';
}
echo preg_replace_callback('#\[(.*?)\]#', ('italic'.'bold'), $text);
//echo preg_replace_callback('#\*(.*?)\*#', 'italic', $text);
//echo preg_replace_callback('#\*(.*?)\*#', 'bold', $text);

результат:

Предупреждение: preg_replace_callback (): требуется аргумент 2, ...

ожидайте:

<i>italic</i> Hello <b>Bold</b>!
<i>true</i> Yes <b>Haaa</b>, you are <b>super</b>!

1 Ответ

0 голосов
/ 22 января 2020

Здесь нет необходимости в preg_replace_callback, просто используйте массив регулярных выражений и замен на preg_replace

echo preg_replace(['/\[(.*?)\]/', '/\*(.*?)\*/'], ['<i>$1</i>', '<b>$1</b>'], $text);

Если вы хотите использовать preg_replace_callback(), вы можете захватить разделитель и использовать if оператор:

echo preg_replace_callback('/([[*])(.*?)[]*]/', function($matches) {
    if ($matches[1] == '[') {
        return italic($matches[2]);
    } elseif ($matches[1] == '*') {
        return bold($matches[2]);
    }
}, $text);
...