PHP preg_replace'e'修饰符困境

时间:2010-11-02 23:25:08

标签: php regex

我已经和它斗争了几天了,看起来我真的要问别人了。

出于这个线程的目的,问题是:我试图使用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_callback无法解决问题。

1 个答案:

答案 0 :(得分:2)

请改用preg_replace_callback! 'e'选项可能很危险。 preg_replace_callback示例:

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

显然,你可以制作一个更精细的函数来检查文件是否存在或者其他什么。此代码使用PHP 5.3匿名函数,因此如果您不在PHP 5.3上运行,则必须使用较旧的语法。

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

Edit2:你的尺码功能是什么?它看起来像打印值而不是返回它。

function test() {
    echo "world";
}

echo "hello " . test(); // worldhello