preg_replace: ссылочный объект на замену

Знаете ли вы какой-либо способ сослаться на объект в замещающей части preg_replace. Я пытаюсь заменить заполнители (разделенные знаками предпроцента) в строке со значениями атрибутов объекта. Это будет выполняться в самом объекте, поэтому я испробовал всевозможные способы обращения к $this с модификатором /e. Что-то вроде этого:

/* for instance, I'm trying to replace
 * %firstName% with $this->firstName
 * %lastName% with $this->lastName
 * etc..
 */
$result = preg_replace( '~(%(.*?)%)~e', "${'this}->{'\\2'}", $template );

Я не могу заставить любую вариацию на эту тему работать. Одно из сообщений, которые я получаю: Не удается преобразовать объект Model_User в строку.

Но, конечно, я не собираюсь преобразовывать объект, представленный $this, в строку... Я хочу получить атрибут объекта, который соответствует заполнителю (конечно, без знаков процента).

Я думаю, что я на правильном пути с модификатором /e. Но и в этом не совсем уверен. Может быть, этого можно добиться гораздо проще?

Есть идеи по этому поводу? Заранее спасибо.


person Decent Dabbler    schedule 07.09.2009    source источник


Ответы (2)


Как я прокомментировал ответ Пола: тем временем я сам нашел решение. Решение намного проще, чем я думал. Я не должен был использовать двойные кавычки.

Решение так же просто, как это:

$result = preg_replace( '~(%(.*?)%)~e', '$this->\\2', $template );

Надеюсь, это поможет кому-нибудь еще для дальнейшего использования.

Ваше здоровье.

person Decent Dabbler    schedule 07.09.2009
comment
Я тоже кое-чему научился - я поражен тем, что ссылка $this работает в этом случае! - person Paul Dixon; 07.09.2009
comment
Что ж, тогда, думаю, мой вопрос был не напрасным. :) Ваше здоровье. - person Decent Dabbler; 07.09.2009
comment
Если вы все еще используете двойные кавычки, вам просто нужно избежать знака доллара в вызове preg_replace следующим образом: preg_replace(~(%(.*?)%)~e, \$this-›\\2, $template) ; - person MrBuBBLs; 17.12.2012

Ознакомьтесь с preg_replace_callback — вот как вы можете его использовать.

class YourObject
{

    ...

    //add a method like this to your class to act as a callback
    //for preg_replace_callback...
    function doReplace($matches) 
    {
        return $this->{$matches[2]};
    }

}

//here's how you might use it
$result = preg_replace_callback(
    '~(%(.*?)%)~e', 
    array($yourObj, "doReplace"), 
    $template);

В качестве альтернативы, используя модификатор /e, вы можете попробовать это. Я думаю, что единственный способ заставить его работать в вашем случае - поместить ваш объект в глобальную область видимости.

$GLOBALS['yourObj']=$this;
$result = preg_replace( '~(%(.*?)%)~e', "\$GLOBALS['yourObj']->\\2", $template );
person Paul Dixon    schedule 07.09.2009
comment
Привет Павел, Спасибо за указатель. Но я уже знаю о preg_replace_callback. Я надеялся, что это может быть достигнуто без него. Как вы думаете, это возможно? Я думаю, что должен, но не могу получить правильный синтаксис. - person Decent Dabbler; 07.09.2009
comment
Привет Павел, еще раз спасибо за ваши усилия. Но, как вы часто увидите: если вы попробуете еще раз, вы найдете решение уже после того, как задали вопрос. В этом случае я тоже нашел решение. :-/ Это было намного проще, чем я думал. Я опубликую решение здесь в качестве ответа. - person Decent Dabbler; 07.09.2009