2012-04-25 128 views
1

只是一个简单的问题。我有一个存储在函数中的联系表单,因为它更容易在我想要的页面上调用它。str_replace:用函数替换字符串

为了扩展可用性,我想使用str_replace搜索{contactform}。

实施例:

function contactform(){ 
    // bunch of inputs 
} 

$wysiwyg = str_replace('{contactform}', contactform(), $wysiwyg); 

因此,基本上,如果{联系形式}中找到。将其替换为contactform的输出。

现在我知道我可以在替换之前运行该函数并将其输出存储在一个变量中,然后将其替换为相同的变量。但我很想知道是否有比我想到的更好的方法。

感谢

+0

如果{contactform}大部分时间没有出现,最好使用@jedwards建议的'preg_replace_callback'。如果它始终存在,那么你现在的代码是最有意义的。 – 2012-04-25 08:22:10

回答

1

您的方法很好,如果您打算多次使用contactform()的内容,我会将它设置为$ var。

在运行str_replace函数之前,使用http://php.net/strpos来检查{contact_form}是否存在可能会付出代价。

你可以尝试两种方式,如果你的服务器支持它,风向标:

<?php echo 'Memory Usage: '. (!function_exists('memory_get_usage') ? '0' : round(memory_get_usage()/1024/1024, 2)) .'MB'; ?> 
0

你可能想看看PHP的call_user_func()更多的信息在这里http://php.net/call_user_func

$wysiwyg = 'Some string and {contactform}'; 

$find = '{contactform}'; 

strpos($wysiwyg, $find) ? call_user_func($find) : ''; 
2

要回答你的问题,你可以使用PCRE和preg_replace_callback,然后要么修改contactform()功能或者创建一个接受匹配的包装器。

我认为你一次运行该函数并将其存储在一个变量中的想法更有意义。

0

是的,有:自己写一个。 (除非已经有一个,这在PHP中总是很难确定;请参阅我的下一个要点。)

啊,那里是:preg_replace_callback()。当然,它是三个正则表达式库之一,因此不会进行简单的字符串操作。

无论如何,我的观点是:不要遵循PHP的[非]设计指南。使用回调编写自己的多字节安全的字符串替换函数,并且不要使用call_user_func()