eval()中的内容未在所需位置呈现

时间:2019-03-17 18:09:03

标签: 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("\r\n",'',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;');上。它不会将令牌替换为令牌的实际位置,而是将令牌替换为所需的内容,但将其放置在内容本身之上,而不是放置在令牌放置的所需位置,如图here所示。 (请注意:示例小部件的延迟时间为2秒)

如果我使用eval(file_get_contents($val));,则令牌会在所需位置被替换为所需的已解析内容,但也会向内容中添加'?>

我不确定自己在做什么错。

1 个答案:

答案 0 :(得分:2)

您不应该使用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_*函数集都处理输出缓冲。因此,它不是将其直接发送到输出,而是将其捕获并将其放入变量中。