2012-04-25 133 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()