2009-09-07 3 views
0

preg_replace의 교체 부분에서 객체를 참조하는 방법을 알고 있습니까? 문자열의 자리 표시 자 (백분율 기호로 구분)를 객체의 속성 값으로 대체하려고합니다. 이것은 객체 자체에서 실행될 것이므로/e 수정자를 사용하여 $ this를 참조하는 모든 종류의 방법을 시도했습니다. 다음과 같이 입력하십시오 :preg_replace : 교체 대상 참조 객체

/* 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 객체를 string으로 변환 할 수 없습니다.

물론 $ this가 나타내는 객체를 문자열로 변환하는 것은 아닙니다 ... 개체 틀의 자리 표시 자와 일치하는 속성을 가져오고 싶습니다 (백분율 기호는 물론 제외).

나는/e 수정자를 올바르게 추적하고 있다고 생각합니다. 그러나 이것에 대해 완전히 확신 할 수도 없습니다. 아마도 이것은 훨씬 더 간단하게 달성 될 수 있습니까?

이것에 대한 아이디어가 있으십니까? 미리 감사드립니다.

답변

2

에 개체를 넣어하는 것입니다 그것을 작동하게하는 유일한 방법을 생각한다. 해결책은 생각보다 훨씬 간단합니다. 큰 따옴표를 사용해서는 안됩니다.

이 솔루션은이만큼 간단하다 :

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

희망이 나중에 참조 할 수 있도록 다른 사람을 도움이됩니다.

건배.

+0

나는이 경우에도이 참조가 작동한다는 것에 놀랐다. –

+0

글쎄, 그럼 내 질문은 헛되지 않았다. :) 건배. –

+0

여전히 큰 따옴표를 사용하는 경우 다음과 같이 preg_replace 호출에서 달러 기호를 이스케이프해야합니다. preg_replace ("~ (% (. *?) %) ~ e", "\ $ this -> \\ 2 ", $ template); – MrBuBBLs

0

체크 아웃 preg_replace_callback - 사용 방법은 다음과 같습니다.

/e 수정자를 사용하여 시도해 볼 수도 있습니다. 한편 나는 해결책을 발견 자신을 : 당신의 경우 내가 바울의 대답에 주석처럼 전역

$GLOBALS['yourObj']=$this; 
$result = preg_replace('~(%(.*?)%)~e', "\$GLOBALS['yourObj']->\\2", $template); 
+0

안녕하세요 Paul, 포인터를 이용해 주셔서 감사합니다. 하지만 이미 preg_replace_callback을 알고 있습니다. 나는 이것이 이것이없이 이루어질 수 있기를 바랐다. 이게 가능하다고 생각하니? 나는 그것이해야한다고 생각하지만, 올바른 구문을 얻을 수 없습니다. –

+0

안녕하세요 Paul, 다시 노력해 주셔서 감사합니다. 그러나 자주 볼 수 있듯이 : 다른 질문을 주면 질문을 한 후에 해결책을 찾을 수 있습니다. 이 경우에도 해결책을 찾았습니다. :// 내가 생각했던 것보다 훨씬 더 간단했다. 해결책으로 여기에 해결책을 게시 할 것입니다. –