我已经和它斗争了几天了,看起来我真的要问别人了。
出于这个线程的目的,问题是:我试图使用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无法解决问题。
答案 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