2014-10-01 2 views
0

사용자가 MathJax로 변환하는 BBCode를 입력 할 수 있도록 허용하고 있습니다. 그러나 아래에서 볼 수 있듯이 문제가 있습니다.JavaScript ReGeX : 두 문자열 사이에서 일치하는 문자열 바꾸기

function chatFormat(text){ 
    text = text.replace('\\', ''); 
    text = text.replace(/\[f\](.+?)\/(.+?)\[\/f\]/igm, '\\(\\frac{\\text{$1}}{\\text{$2}} \\)'); 
    text = text.replace(/\[eq\](.+?)\[\/eq\]/igm, '\\($1 \\)'); 
    text = text.replace(/(.+?)\^(.+?)/igm, '\\($1^{\\text{$2}} \\)'); 
    text = text.replace(/\[sqrt\](.+?)\[\/sqrt\]/igm, '\\(\\sqrt{\\text{$1}} \\)'); 

    return text; 
} 

거의 잘됩니다. BBCode를 완벽하게 적절한 명령으로 변환합니다. 그러나 명령을 중첩하기 시작하면 문제가 발생합니다.

[eq]15^2 = [sqrt]225[/sqrt][/eq]

그것은 변환됩니다 : 예 :

사용자 유형의 경우

\(15^{2} = \(\sqrt{225} \) \)

  ^  ^
      |   | 
      |   | 
      |   | 
       HOW TO AVOID 

어떻게 추가 \(\) 피할 수 있습니다 때 BBCode, bbcode 안의 제곱근 명령과 같은 BBCodes를 중첩합니다. ?

감사합니다.

답변

1

임의로 중첩 된 패턴 (예 : Can regular expressions be used to match nested patterns? 참조)에 사용할 수 없으므로 정규 표현식의 경우 매우 어려울 수 있습니다. 이런 종류의 정교한 중첩 구문 분석이 필요하다면 실제 구문 분석기를 작성하는 것이 낫습니다. 또는 BBCode가 이미 일반적이므로 이미 존재하는 구문을 사용하는 것이 좋습니다. 다음은 상당히 확장 성이있어 사용자의 요구에 맞을 수있는 것입니다. https://github.com/patorjk/Extendible-BBCode-Parser

+0

죄송합니다. 어떤 링크가 더 적절하게 설명되어 있어야할까요? 첫 번째는 일반적인 문제 (특히 정규 표현식이 중첩 된 표현식을 파싱하는 데 부적절한 이유)에 대해 매우 앞섰던 stackoverflow 주제를 가리키고 두 번째 링크는이 특정 문제를 해결할 수있는 라이브러리를 가리키고 있습니다. – caseygrun

관련 문제