2010-02-09 1 views
2

잡아 이 문자열과 어떻게 일치합니까? :PHP 정규식은 {태그} 뭔가 {/ 태그} 나는 PHP의 레그 기능 (는 preg_match, 등)와 함께 사용할 정규식 문자열 = 마련하기 위해 노력하고있어이 난처한 상황에 빠진하고

{area-1}some text and maybe a <a href="http://google.com">link</a>.{/area-1} 

preg_replace를 사용하여 다른 문자열로 바꾸길 원합니다.

지금까지 나는 이런 식으로는 preg_match와 함께 첫 번째 태그를 식별 할 수있었습니다 : 당신이 도울 수 있다면

preg_match("/\{(area-[0-9]*)\}/", $mystring); 

감사합니다! 중첩 된 태그가없는 경우

+0

@Mike B : HTML이 아닙니다. – Gumbo

+0

@Gumbo 매우 사실, 나는 내 의견을 철회. –

답변

4

, 일이 간단한 작업을해야합니다 :

preg_match_all("~{.+?}(.*?){/.+?}~", $mystring, $matches); 

귀하의 결과는 다음 $matches[1]에서 찾을 수 있습니다.

+0

이 문맥에서'~'문자는 무엇을 하는가? – donut

+4

@donut 패턴의 시작과 끝을 나타내는 패턴 구분 기호. 그들은 거의 모든 문자 쌍으로 (afaik) 대체 될 수 있습니다. 슬래시는 일반적으로 사용됩니다. –

+0

슬래시는 일반적이지만 정규식 자체에 슬래시가 포함 된 경우에는 어색합니다. 이 경우 슬래시를 이스케이프해야하며 다른 문자를 사용하면이를 피할 수 있습니다. –

0

나는

preg_match_all("~\{(area-[0-9]*)\}(.*?)\{/\1\}~s", $mystring, $matches); 

다른 태그 당신이보고있는 area 태그 내에 중첩되는 경우에도 작동합니다 제안합니다.

여러 개의 area 태그가 서로 중첩되어 있으면 여전히 작동하지만 정규식을 여러 번 적용해야합니다 (중첩 수준마다 한 번).

물론 일치 항목의 내용은 Tatu의 답변과 마찬가지로 $matches[2]이 아니며 $matches[1]이 아닙니다.

+1

'{'와'}'를 이스케이프 할 필요는 없지만 유효한 토큰 (예 : {n})의 일부가 아니라면 리터럴 문자로 해석됩니다. :) –

+0

RegexBuddy도 백 슬래시를 삽입 했으므로 함께갔습니다. 더 자세히 살펴볼 것입니다. –

+0

도움 주셔서 감사합니다. 나는 그것을 줄 것이다. – Aaron