2013-10-02 62 views
1

我有文本字符串文本的功能替換文本「[您的名稱] < [你的電子郵件]>」,幷包含一個數組,看起來像這樣使用正則表達式在PHP

[posted_data] => Array 
     (
      [_wpcf7] => 35 
      [_wpcf7_version] => 3.5.2 
      [_wpcf7_locale] => en_US 
      [_wpcf7_unit_tag] => wpcf7-f35-p29-o1 
      [_wpnonce] => 2c06b3f0f3 
      [your-name] => Andrew 
      [your-email] => [email protected] 
      [your-subject] => plasd 
      [your-message] => 11 11 11 
      [_wpcf7_is_ajax_call] => 1 
     ) 
對象

所以我想要做的是寫一個函數,用上述字符串中的值替換對象中的值。

到目前爲止,我有這個功能

function wpcf7ev_get_senders_email_address($wpcf7_form) 
{ 
    //gets the tags 
    $senderTags = $wpcf7_form->mail['sender']; 

    // replace <contents> with posted_data 

    $sendersEmailAddress = preg_replace_callback('/\[(.+?)\]/', 
      function ($matches) 
      { 
       return $wpcf7_form->posted_data[$matches[1]]; 
      }, 
      $senderTags 
      ); 

    return $sendersEmailAddress; 

} 

我要對這個正確的方式?該回調函數失敗,因爲匿名函數無法訪問$ wpcf7_form參數。

我用火柴[1]爲正則表達式返回

Array 
(
    [0] => [your-name] 
    [1] => your-name 
) 

因此,也許,可能就太加以改進。

謝謝。

回答

0

傳遞任何依賴於通過use結構,如

function ($matches) use ($wpcf7_form) { 
    // etc 
+0

謝謝菲爾。這工作!漂亮而簡單優雅的解決方案 – magician11

0

創建一個輔助類,並把它作爲回調參數。這樣你可以避免使用全局參數。

class EmailAddressCallback { 
    private $data; 

    function __construct($data) { 
     $this->data = $data; 
    } 

    public function callback_function($matches) { 
     return $this->data->posted_data[$matches[1]]; 
    } 
} 

function wpcf7ev_get_senders_email_address($wpcf7_form) 
{ 
    //gets the tags 
    $senderTags = $wpcf7_form->mail['sender']; 

    // replace <contents> with posted_data 

    $callback = new EmailAddressCallback($wpcf7_form); 
    $sendersEmailAddress = preg_replace_callback('/\[(.+?)\]/', 
      array($callback, 'callback_function'), 
      $senderTags 
      ); 

    return $sendersEmailAddress; 

} 

var_dump(htmlentities(wpcf7ev_get_senders_email_address($wpcf7_form)));