使用PHP中的正则表达式替换带有该文本函数的文本

时间:2013-10-02 00:57:41

标签: php regex

我有文字字符串“[你的名字]< [你的电子邮件]>”和一个包含一个看起来像这个

的数组的Object
  [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] => fr@ibhv.cou
            [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
)

所以也许可以改进。

感谢。

2 个答案:

答案 0 :(得分:0)

通过use构造传递任何依赖项,例如

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

答案 1 :(得分: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)));