2010-11-26 3 views
0

JavaScript로 사용자 측에서 양식 유효성 검사를 수행하고 싶습니다 (jQuery도 사용됨). 목표는 레벨 2 말보다 [quote] 태그 깊은 중첩의 BBCode를 제거하는 것입니다, 우리는이 텍스트가 :JavaScript : 중첩 된 [견적]

[quote=SoundMAX][quote=Laplundik][quote=SoundMAX] 
blahblahblah[/quote] 
blahblah 
[/quote] 
blah[/quote] 

을 그리고이 얻을 :

[quote=SoundMAX][quote=Laplundik] 
blahblah 
[/quote] 
blah[/quote] 

내 유일한 생각은 <div>[quote]을 .replace하는 것입니다, DOM 객체를 생성하고 jQuery로 2보다 깊은 것을 제거하고, 역방향으로 모두 bbCode로 파싱한다. 하지만 그 해결책은 너무 복잡해 보입니다. 더 우아한 것이 있습니까?

편집 : 좋은 솔루션

감사합니다. darioo의 답을 바탕으로이 작업을 수행했습니다.

var text=$('#edit-privatemsgbody').val(); 
var tmp=[]; 
var level=0; 

for (var i=0,l=text.length;i<l;i++){ 
if(text[i]=='['&&text[i+1]=='q') level++; 
if(text[i-6]=='q'&&text[i-7]=='/'&&text[i-8]=='[') level--; 
if(level<3) tmp.push(text[i]); 
} 
alert(tmp.join('')); 

잘 작동합니다.

그러나 idealmachine의 솔루션은 플래시와 같았습니다. 이전에 콜백 함수 매개 변수를 교체하는 방법을 알지 못했지만, 이제는 편리합니다! 나는 그걸로 해결할거야.

+0

* 정규식 포함 : http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – PleaseStand

+0

@idealmachine : 그 이유는 다른 해결책을 요구했습니다. –

답변

2

실제로 네스트 자체를 처리 할 수없는 제한된 도구로 보면 정규 표현식을 사용할 수 있습니다. .replace 문자열 방법은 우리가 마크 업 구조 (도 http://jsfiddle.net/Zbgr3/3/에 게시 코드) 얼마나 깊은 추적 할 수 있습니다 각 경기를 위해 대체 텍스트를 찾기 위해 함수를 호출 할 수 있습니다 :

var quoteLevel = 0; 

alert(s.replace(/\[(\/?)quote[^\]]*\]|./gi, function(tag, slash) { 
    // Opening tag? 
    if(tag.length > 1 && !slash.length) quoteLevel += 1; 
    // What to strip 
    var strip = quoteLevel > 2; 
    // Closing tag? 
    if(tag.length > 1 && slash.length) quoteLevel -= 1; 

    if(strip) return ''; 
    return tag; 
})); 

일부 허용을 원하는 경우 마크 업에서 오류가 발생하면 quoteLevel이 0 아래로 떨어지는 것을 방지하는 코드를 추가 할 수 있습니다.

1

일반 배열을 스택으로 사용하십시오. [quote]가 발생할 때마다 push() 방법을 사용하여 배열을 하나 늘립니다. [/quote]이 발생하면 pop() 메서드를 사용하여 배열을 하나씩 줄입니다.

[quote]가 표시되고 배열 길이가 2 인 경우 해당 [quote]을 제거하고 다음에 표시되는 [/quote]을 제거하십시오.

개폐식 인용 부호가 같지 않은 경우 적절한 방법으로 처리해야합니다.