Содержимое из eval () не отображается в нужном месте

#php

#php

Вопрос:

Я пытаюсь создать систему токенов, которая использует preg_match_all() для идентификации потенциальных токенов в содержимом страницы. Токены содержат URL нужного файла виджета, который будет вызван в содержимое в том месте содержимого, где был размещен токен. {widgets/top-ads/consider-covenant.php}

Пример содержимого с токенами:

 $content = '<p>Ham flank dolore cillum pork loin deserunt consequat strip steak. {widgets/top-ads/consider-covenant.php} Duis magna porchetta ribeye sed chicken t-bone alcatra fugiat salami aliqua do meatball ball tip. Strip steak turducken aliqua biltong sunt, hamburger cupidatat drumstick meatball. Shoulder ut est, spare ribs minim officia labore capicola chuck.</p>{widgets/top-ads/consider-covenant.php}<p>Pork loin tail commodo ball tip t-bone. Turducken dolore pastrami, culpa in commodo mollit prosciutto. Brisket incididunt nisi short loin landjaeger beef ribs jerky tempor capicola bresaola irure labore consequat. Quis in laborum pastrami chuck. Aliquip ham hock drumstick, turkey eu kevin pig doner jowl pork loin dolore est aute pariatur. Frankfurter consequat aliquip meatloaf quis.</p>';
  

Следующая функция идентифицирует токен и затем использует eval() в сочетании с file_get_contents() для получения и анализа желаемого содержимого, затем использует str_replace() для замены токена на желаемое содержимое:

 function replaceTokens($content){
    # run content through short code/widget preg match
    preg_match_all("'{(.*?)}'si", $content, $match); 

    # minimize content
    $content = str_replace("rn",'',str_replace("t",'',$content));

    # replace token with content
    foreach($match[1] as $val) {

        # rebuild token for str_replace()
        $token = '{'.$val.'}';

        # get content
        $this_content = eval('?>'.file_get_contents($val).'<?php;'); 

        # replace token
        $content = str_replace($token,$this_content,$content);
    }
    return $content;    
}
  

Проблема в eval('?>'.file_get_contents($val).'<?php;'); . Вместо замены токена в фактическом местоположении токена, он заменяет токен желаемым содержимым, но помещает его над самим содержимым, а не в желаемое местоположение, где был размещен токен, как показано здесь. (Примечание: виджеты примера находятся с задержкой в 2 секунды)

Если я использую eval(file_get_contents($val)); токен, он заменяется на желаемое проанализированное содержимое в нужном месте, но он также добавляет '?> к содержимому.

Я не уверен, что я делаю неправильно.

Ответ №1:

Вы не должны использовать eval , но:

 foreach($match[1] as $val) {

    # rebuild token for str_replace()
    $token = '{'.$val.'}';

    # get content
    ob_start();
         eval('?>'.file_get_contents($val).'<?php;');
    $this_content = ob_get_clean();

    # replace token
    $content = str_replace($token,$this_content,$content);
}
  

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

Вместо замены токена в фактическом местоположении токена, он заменяет токен желаемым содержимым, но размещает его над самим содержимым, а не в желаемом месте, где был размещен токен

OB_* Весь набор функций имеет дело с буферизацией вывода. Таким образом, вместо отправки его непосредственно на вывод, это фиксирует его и помещает в переменную.

Комментарии:

1. Спасибо за быстрый ответ @ArtisticPhoenix, это решило проблему

2. Конечно, это было — довольно просто 🙂 ~ не осознавал, что это заняло всего 7 минут, у меня это заняло около 7 секунд. С этим я сталкивался много раз. И я использую OB для других целей.