2011-09-10 4 views
4

나는 내가 구문 분석에 다음 문자열을 필요가있다 : 나는 basicly 다음 REGEXREGEX 중첩 패턴 지원?

text = text.replace(/\[QUOTE=(.*?)]([\s\S]*?)\[\/QUOTE\]/gi, '<div class="quotes"><i>Quote by $1</i><br />$2</div>'); 
를 사용하여 양식에 일치 된 DIV에 [견적] 영역을 변환하여 HTML로 BBCode는이 설정을 convern하려고

[QUOTE=Mark] 
    [QUOTE=Jack] 
    How are you doing Mark? 
    [/QUOTE] 
Good to hear from you Jack, Im doing fine! 
[/QUOTE] 

이 코드는 첫 번째 QUOTES 세트를 올바르게 구문 분석하지만 중첩 된 레벨 인용은 분석하지 않습니다. 어떤 식 으로든 내가 표현을 흉내낼 수 있을까?

+0

왜 내가 자바 스크립트로하고 있는지 물어볼 수 있습니까? – yoda

+0

아마도 재귀 적 접근이 필요할 것입니다. 당신의 인용문을 객체로 로딩하는 것은 어떻습니까 (Quote $ author $ text $ subquotes ...)? 그런 다음 원하는 형식으로 출력 할 수 있습니다. –

답변

3

중첩 된 레벨이되면 입력의 "일반적인"특성을 잃게됩니다. HTML which is always a hard spot for regexes처럼 더 많은 것이 "context free"이됩니다.

문자열을 토큰 화하고 recursive descent parser처럼 somethink를 사용하여 구문 분석하는 것이 좋습니다.

+0

'PCRE -PHP'의'Atomic Grouping'은 그 주제를 해결하지 않을까요? 그냥 호기심 :) – yoda

+0

@yoda : 그룹화가 아닌 것은 아니지만 PHP에서 정규식을 사용하여 중첩 된 BB를 구문 분석하는 것은 간단합니다. 것은, 그는 JS (내가 기억하는 한 훨씬 덜 강력한 정규 표현식을 사용하고있다)입니다. – NikiC

4

그게 당신이하고있는 모두의 경우,이 솔루션은 매우 간단하다 :

text = text.replace(/\[QUOTE=(.*?)\]/gi, 
        '<div class="quotes"><i>Quote by $1</i><br />'); 
text = text.replace(/\[\/QUOTE\]/gi, '</div>'); 

귀하의 코드도 작동하지만 당신은 그것을 여러 번 적용해야 - 삼중가있는 경우 두이 경우에, 그러나 - 따옴표를 사용하면 패스 세 개를 만들어야합니다.

+0

욕심쟁이'. *'를위한 시계 ... – jswolf19