代码之家  ›  专栏  ›  技术社区  ›  Jeff Meyers

php preg_替换“e”修饰符困境

  •  0
  • Jeff Meyers  · 技术社区  · 15 年前

    我已经为此斗争了几天了,看起来我真的需要问别人。

    为了这个线程的目的,这里有一个问题:我试图使用php的preg_replace和“e”修饰符来操作一个字符串来执行其中的函数。我想更改的任何实例 [pdf]somefilename[/pdf] <a href="somefilename.pdf">PDF</a> size('somefilename.pdf');

    例如,也许 [pdf]someFileName[/pdf]文件名 将输出一个指向文件的链接,后跟(137MB)。

    然而,出于某种原因,(137MB)部分被放在 开始 而不是它应该在的地方。看起来像 preg_replace 正在对所有内容进行评估,然后返回并执行函数,并将结果抛出到字符串的开头。

    如果我有 Some text blah, blah. Download the document: [pdf]somefilename[/pdf] 正则表达式输出 (137MB) Some text blah, blah. Download the document: [link to document] 当它 应该 输出 Some text blah, blah. Download the document [link to document] (137MB) .

    我迷路了。谷歌救不了我。有人请帮忙!

    事先谢谢, 杰夫

    代码如下:

    $bbcode_pdf_tag = '/\[pdf\](.*?)\[\/pdf\]/ie';
    $html_pdf_tag = '"<a href=\"$1.pdf\">PDF</a>" .size("\\1.pdf")';
    $decoded_data = preg_replace($bbcode_pdf_tag, $html_pdf_tag, $data);
    

    编辑:值得一提的是,size()是在完全不同的文件中定义的,当我使用诸如strtolower()之类的内置函数时,这种情况似乎不会发生。在内部定义size()函数并使用preg_replace_回调并不能解决问题。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Vincent Savard Midhun    15 年前

    用preg替换回调!e'选项可能很危险。preg_replace_回调示例:

    preg_replace_callback('`\[pdf\]([^\[]+)\[/pdf\]`i', function ($matches) { return "<a href=\"{$matches[1]}\">PDF</a> " . filesize($matches[1]); }, $string);
    

    显然,您可以创建一个更详细的函数来检查文件是否存在。这段代码使用了php 5.3匿名函数,因此如果不在php5.3上运行,就必须使用旧的语法。

    编辑:在看到评论和OP的编辑文章之前,我写了这个答案,所以我可能错过了一些东西。

    你的尺寸是多少?它看起来是打印值而不是返回值。

    function test() {
        echo "world";
    }
    
    echo "hello " . test(); // worldhello