preg_replace_callback_array Не возвращает значение вычисления соответствия - PullRequest
0 голосов
/ 21 марта 2019

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

<?php
$kode = array (
  "/\[math\]([0-9+\-\/*\)\(]+?)\[\/math\]/" =>
    function($matches) {$value = "$matches[1]"; return $value;},
);
$body = 'my result is [math]100-3[/math]';

echo preg_replace_callback_array($kode,$body);
?>

Bbcode работает нормально, но не возвращает расчет

Если я использую [math]100+10[/math], возвращается 100+10, но я хочу получить 110 здесь

Ответы [ 3 ]

1 голос
/ 21 марта 2019

Это, в общем, сложно. Ваша оценка $value = "$matches[1]" будет просто оценивать строковое значение. В базовой библиотеке PHP нет простой функции для преобразования строки формулы численного расчета в результат.

Однако вы можете научиться устанавливать chriskonnertz / string-calc с Composer и использовать его.

<?php

use ChrisKonnertz\StringCalc\StringCalc;

$kode = array (
  "/\[math\]([0-9+\-\/*\)\(]+?)\[\/math\]/" => function($matches) {
    $calc = new StringCalc();
    return $calc->calculate($matches[1]);
  },
);
$body = 'my result is [math]100-3[/math]';

echo preg_replace_callback_array($kode,$body);
?>
0 голосов
/ 21 марта 2019

спасибо всем за ответ, я заставляю его работать так

  $kode = array (
  "/\[math\]([0-9+\-\/*\)\(]+?)\[\/math\]/" =>
    function($matches) {$value = "$matches[1]"; return eval('return ' . $value . ';');},
);
$body = 'my result is [math]100-3[/math]';

echo preg_replace_callback_array($kode,$body);
0 голосов
/ 21 марта 2019

Вы можете сделать это с eval().Обычно это очень опасная функция, но ваш шаблон соответствует только простым числовым выражениям, поэтому здесь безопасно.

$kode = array (
  '/\[math\]([0-9+\-\/*)(]+?)\[\/math\]/' =>
    function($matches) {eval("\$value = $matches[1];"); return $value;},
);
...