LINUX.ORG.RU

косвенный вызов функции в php

 


0

1

Предположим есть строка:

{идёт} бычок {качается}, {вздыхает} на ходу
нужно найти слова {в фигурных скобках}, и заменить каждое слово на вывод своей функции:
{идёт} ← going()
{качается} ← dangle()
{вздыхает} ← sighs()
есть в php какой-нить более элегантный метод, кроме switch/case?

Да, желательно, что-бы это побыстрее работало.


Ответ на: комментарий от anonymous

ну типа

switch($word)
{
case "{идёт}":
  $word = going();
  break;
case "{качается}":
  $word = dangle();
  break;
case "{вздыхает}":
  $word = sighs();
  break;
}

emulek
() автор топика

тебе все равно нужна таблица соответствия строки и функции. хоть бы и так:

$str_to_fn = [
    "идёт" => "going",
    "качается" => "dangle",
    "вздыхает" => "sighs",
];
$in = '{идёт} бычок {качается}, {вздыхает} на ходу';
$out = preg_replace_callback("~{([^}]+)}~",
    function ($match) use (&$str_to_fn) {
        if (isset($str_to_fn[$match[1]]) and is_callable($str_to_fn[$match[1]])) {
            return call_user_func($str_to_fn[$match[1]]);
        } else return '';
    },
    $in);
echo $out;
dmiceman ★★★★★
()
Ответ на: комментарий от dmiceman

можно strpos()-ом искать «{» и потом руками парсить. но оно того обычно не стоит.

я первый пост немного неправильно написал, на самом деле у меня УЖЕ готовые имена функций

{going} bull {dangle}, {sighs} on the go
но я постеснялся своего «английского»…

решил след. образом:

        $s = "askllkd adkdal dsklk {abc} kjkjf {def} fdfd";
        echo "¨".
                preg_replace_callback(
                        array(
                                "#{abc}#",
                                "#{def}#"
                        ),
                        function ($match)
                        {
                                return call_user_func(substr($match[0], 1, -1));
                        },
                        $s
                ) ."¨<br>\n";

emulek
() автор топика
$o = array(
'{идёт}' => going(),
'{качается}' => dangle(),
'{вздыхает}' => sighs()
);

echo strtr('{идёт} бычок {качается}, {вздыхает} на ходу', $o);
kiotoze ★★★★
()
Последнее исправление: kiotoze (всего исправлений: 1)

Че то ты замудрил, п*ц, Я похапе не знаю, но в любом языке это можно сделать тупыми реплейсами.


replace=function(str, arr){
 return str.replace(/\{[^}]*\}/g, function(x){return arr.shift()()})
}

replace("foo {foo} bar {bar} baz {baz}",
         [function(){return "one"}, function(){return "two"}, function(){return "three"}]
)

// foo one bar two baz three

а ты тут уже диссертацию целую накатал. Следующий раз бери тему «как с помощью похапе ввернуть лампочку в люстру»

nuboquest
()
Ответ на: комментарий от nuboquest

Я похапе не знаю

ну и проходи мимо. Мне такое решение как у тебя не нужно.

emulek
() автор топика

Ище одна версия, с распоследними пожеланиями:

$in = '{going} bull {dangle}, {sighs} on the go';
echo preg_replace_callback('/(?:\{([^\}]+)\})/', function($m) {
    return isset($m[1]) && function_exists($m[1]) ? $m[1]() : $m[0];
}, $in);
Если ф-цию не найдет, тогда оставит метку не тронутой. Можно еще и передачу аргументов прикрутить кстати.

deep-purple ★★★★★
()
Ответ на: комментарий от no-such-file

Есть. Называется ООП.

что-то я не врубаюсь в пхпшное ООП. Где об этом можно почитать?

Классы я нашёл, и конструкторы нашёл, а там есть виртуальные функции? И как их к моей задаче разбора строки приколотить?

emulek
() автор топика
Ответ на: комментарий от deep-purple

дык мой вариант лучше косвенный вызов функции в php (комментарий)

Можно еще и передачу аргументов прикрутить кстати.

угу. function (…) use ($argument)

Уже привинтил.

isset($m[1])

вот нафига? Я ищу {function_name}, отрезаю {}, и запускаю function_name(). Зачем мне лишняя сущность?

emulek
() автор топика
Ответ на: комментарий от emulek

дык мой вариант лучше

Тем что при написании новой ф-ции надо еще и метку в список добавлять?

угу. function (…) use

Я не совсем про то, всмысле не через то место ))

вот нафига?, отрезаю {} Зачем мне лишняя сущность?

А я в нулевой маске же сказал не запоминать "?:", тогда, если нет нулевой, то и калбяк не вызовется, а если есть, то в первой уже не надо делать твое «отрезаю {}». Вообще тот иссет можно выкинуть, да.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от emulek

Сократил чутка, один хрен с $m[1] только получается, если хочется не отрезать потом, т.к. $m[0] это весь паттерн от начала до конца:

function going()
{
    return 'Going replaced!';
}

$in = '{going} bull {dangle}, {sighs} on the go';
echo preg_replace_callback('/\{([^\}]+)\}/', function($m) {
    return function_exists($m[1]) ? $m[1]() : $m[0];
}, $in);

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Тем что при написании новой ф-ции надо еще и метку в список добавлять?

у меня _один_ массив и для патернов, и для имён функций.

угу. function (…) use

Я не совсем про то, всмысле не через то место ))

чем это место плохо?

А я в нулевой маске же сказал не запоминать "?:", тогда, если нет нулевой, то и калбяк не вызовется, а если есть, то в первой уже не надо делать твое «отрезаю {}».

чего-бы не отрезать?

emulek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.