2008-09-17 5 views
1

사용자 입력 태그를 실제 HTML 태그로 대체하기 위해 일부 JavaScript RegEx를 작성하려고하므로 [b]<b>이됩니다. 와 내가 그렇게자바 처리 RegEx 서브 작업 처리

var exptags = /\[(b|u|i|s|center|code){1}]((.){1,}?)\[\/(\1){1}]/ig; 

같은 외모를 사용하고있는 정규식 다음과 같은 자바 스크립트

s.replace(exptags,"<$1>$2</$1>"); 

이 예를 들어, 하나의 중첩 된 태그 잘 작동 :

[b]hello[/b] [u]world[/u] 

하지만 태그가 중첩 된 경우 서로 내부에만 바깥 태그와 일치합니다 (예 :

)
[b]foo [u]to the[/u] bar[/b] 

이 태그는 b 태그와 일치합니다. 이 문제를 어떻게 해결할 수 있습니까? 시작 문자열이 결과와 동일 할 때까지 그냥 반복해야합니까? ((.){1,}?) patten도 잘못되었다는 느낌이 들었습니까?

감사는 정규 표현식 재귀를 표현할 수

+0

var tagreg = /\[(\/?)(b|u|i|s|center|code)]/ig div.innerHTML="[b][i]helloworld[/b]".replace(tagreg, "<$1$2>") //no closing i //div.inerHTML=="<b><i>helloworld</i></b>" 
: http://stackoverflow.com/a/1732454/20074 – Ken

답변

1

AFAIK.

그러나 .NET의 System.Text.RegularExpressions에서 균형 조정을 사용하여이를 수행 할 수 있습니다. 더 자세히보기 : http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx

.NET을 사용하는 경우 콜백을 통해 필요한 것을 구현할 수 있습니다. 그렇지 않으면 자신의 작은 자바 스크립트 파서를 굴려야 할 수도 있습니다.

그런 다음 다시 서버를 사용할 수 있으면 전체 구문 분석기를 사용할 수 있습니다. :)

어쨌든 이것을 위해 무엇이 필요합니까? 미리보기 이외의 경우 서버 측 처리를 적극 권장합니다.

+0

예 자사의 PHP 측 라이브 코멘트 영역에 대한 미리보기, 서버,하지만이 그 비트의 코드. – Re0sless

0

예, 루프해야합니다. 또는 태그가 HTML과 매우 흡사하기 때문에 <b>의 경우 [b]을, </b>의 경우 [/b]을 별도로 바꿀 수 있습니다. (.){1,}? (. *?)와 동일합니다 - 즉, 모든 기호, 가능한 최소 시퀀스 길이.

업데이트 : MrP 님, (.) {1,}에게 감사드립니다. (.) +?, 나쁘다.

0

귀찮은 내부 패턴에 대해서는 맞습니다.

((.){1,}?) 

적어도 한 번 캡처 된 일치를 수행하면 모든 것이 캡처됩니다. 태그 안의 모든 문자는 그룹으로 캡처됩니다.

필요하지 않을 때 닫는 요소 이름을 캡처하고 있음을 의미 할 때 {1}을 사용하고 있습니다. 다음은 정리 버전입니다.

/\[(b|u|i|s|center|code)](.+?)\[\/\1]/ig 

다른 문제는 확실하지 않습니다.

0

regexp가 더 이상 일치하지 않을 때까지 반복 적용 할 수 있습니다."< b> [b] foo </b> [/ b]"=> "< b> < b와 같은 이상한 점이있을 것입니다. > foo </b> </b> "하지만, 최종 결과가 여전히 일치하는 (반드시 적절하게 중첩되지는 않지만) 태그와 함께 현명한 문자열이 될 것입니다.

아니면 '올바르게'하고 싶다면 간단한 재귀 파서를 작성하면됩니다. 사람들은 "[foo [u] bar [b] baz [/ u]"가 작동하기를 기대하지만 파서로 인식하는 것은 까다 롭습니다.

0

중첩 블록이 대체되지 않는 이유는 [b]의 일치가 [/ b] 다음에 위치하기 때문입니다. 따라서 ((.) {1,}?)이 일치하는 모든 것은 무시됩니다.

서버 측에 재귀 파서를 작성하는 것이 가능합니다. Perl은 qr//을 사용하고 Ruby는 아마도 비슷한 것을 가지고있을 것입니다.

실제로 재귀 적으로 필요한 것은 아닙니다. 당신은 동등 문자열 처리하기 위해 비교적 간단한 루프를 사용할 수 있습니다 또한


0: [b]hello[/b] [u]world[/u] [b]foo [u]to the[/u] bar[/b] 
1: <b>hello</b> <u>world</u> <b>foo [u]to the[/u] bar</b> 
2: <b>hello</b> <u>world</u> <b>foo <u>to the</u> bar</b> 
이 위로 청소에 대한 몇 가지 제안 :이 경우

var s = '[b]hello[/b] [u]world[/u] [b]foo [u]to the[/u] bar[/b]'; 
var exptags = /\[(b|u|i|s|center|code){1}]((.){1,}?)\[\/(\1){1}]/ig; 

while (s.match(exptags)) { 
    s = s.replace(exptags, "<$1>$2</$1>"); 
} 

document.writeln('<div>' + s + '</div>'); // after 

를, 그것은 2 개 패스를 만들 수 있습니다 정규식 :

var exptags = /\[(b|u|i|s|center|code)\](.+?)\[\/(\1)\]/ig; 
  • 는 {1} 가정하면 전혀 다른 계산 지정자
  • {1} 리처드 Szalay에 동의 +
+0

[center] [/ center]를 테스트 케이스에 추가하고 다른 태그 안에 하나의 태그를 중첩시키고 아래에서 내 정규 표현식을 가져 가면 답변에 투표 할 것입니다. –

+0

"다른 태그 내부에 하나의 태그를 중첩"한다는 의미는 "그 자체가 같은 태그"를 의미합니다. 예 : [b] foo [b] bar [/ b] baz [/ b] –

0

로 단축 할 수 존재하지만, 자신의 정규식은 잘 인용되지 않았다

var exptags = /\[(b|u|i|s|center|code)](.*)\[\/\1]/ig; 

청소기입니다. .+?.*으로 변경합니다. 두 가지 문제가 .+?에 있습니다

    이 일치하지 않습니다 [유] [/ U], 그들 사이에 적어도 하나 개의 문자 (+)가 존재하지 않기 때문에
  1. 아닌 욕심 일치 원
  2. ' 자체 내에 중첩 같은 태그로 잘 t 거래
0

방법에 대한 (?) 나를 위해

tagreg=/\[(.?)?(b|u|i|s|center|code)\]/gi; 
"[b][i]helloworld[/i][/b]".replace(tagreg, "<$1$2>"); 
"[b]helloworld[/b]".replace(tagreg, "<$1$2>"); 

위의 생산 :

<b><i>helloworld</i></b> 
<b>helloworld</b> 

이것은 원하는대로 수행되는 것으로 보이며 한 번만 전달하면된다는 장점이 있습니다.

면책 조항 : 내가 어떤 실수를하는 경우

3

가장 쉬운 해결책은 모든 태그를 대체하는 것입니다 :-)을 지적 주시기 바랍니다 그래서 나는 그들이 여부, 종종 JS 코드를하지 않습니다 닫히지 않았습니까? .innerHTML이 일치하거나 그렇지 않으면 훨씬 더 탄력적 인 방법으로 해결할 수 있습니다.

나는 아무도 여기를 떠난 적이있다 믿을 수 없어