2010-12-11 4 views
4

자바 스크립트에서이 정규식 ({[^{}]*})으로 나눠보고 있는데 IE7과 FF의 다른 결과가 나옵니다. 파이어 폭스 결과가 올바른 것입니다.javascript IE7의 정규식 버그

<style> 
.box.round { 
    border-radius: 10px; 
} 
</style> 
<script> 
jQuery(function ($) { 
    $('style').each(function() { 
    text = $(this).html(); 

    alert(text); 
    alert(text.split(/({[^{}]*})/)); 
    // result in FF: .box.round ,{border-radius: 10px;}, 
    // result in IE7: .box.round 
    }); 
}); 
</script> 

업데이트 는 IE7에서 작동하므로 또한 자바 스크립트 라이브러리를 추가하지 않고 정규 표현식을 변경하는 방법이 있나요?

+0

예, 버그입니다. 정확히 네 질문은 뭐니? –

+0

regex를 바꾸는 방법이 있나요? IE7에서도 자바 스크립트 라이브러리를 추가하지 않고 작동합니까? – Codler

+0

정규식 이외에는 CSS를 파싱하는 것이 반드시 잘 작동하지는 않습니다. – Pointy

답변

0

나는 정규식 ({[^{}]*})과 그 외 다른 것들에도 적용되는 해결책을 만들었습니다.

function ieSplit(str, separator) { 
    var match = str.match(RegExp(separator, 'g')); 
    var notmatch = str.replace(new RegExp(separator, 'g'), '[|]').split('[|]'); 
    var merge = []; 
    for(i in notmatch) { 
     merge.push(notmatch[i]); 
     if (match != null && match[i] != undefined) { 
      merge.push(match[i]); 
     } 
    } 
    return merge; 
} 
alert(ieSplit(text, '({[^{}]*})')); 
// result in FF : .box.round ,{border-radius: 10px;}, 
// result in IE7: .box.round ,{border-radius: 10px;}, 
6

.split() regexes에서 캡처 된 그룹의 처리 방식을 변형 할 수있는 가능한 해결책은 this old blog post을 참조하십시오. 그 기사에서

:

  • Internet Explorer가 (결과 배열에서 거의 모든 빈 값을 제외 예를 들어, 두 개의 구분 기호는 데이터에서 서로 옆에 나타날 때, 또는 구분은 시작에 나타날 때 또는 데이터의 끝). 이것은 구분 기호로 문자열을 사용할 때 IE가 빈 값을 포함하기 때문에 나에게 이해가되지 않습니다.
  • Internet Explorer 및 Safari는 캡처 된 괄호 값을 반환 된 배열에 연결하지 않습니다.이 기능은 간단한 파서 등을 사용하면 유용 할 수 있습니다.
  • Firefox는 반환 된 배열에 결과 값으로 정의되지 않은 값을 연결하지 않습니다. - 캡쳐 그룹 참여.
  • Internet Explorer, Firefox 및 Safari는 분할 사양을 따르지 않는 다양한 추가 엣지 케이스 버그가 있습니다 (실제로는 상당히 복잡합니다).

Levithan의 XRegExp 라이브러리는 정말 작고 유용하며,이 수정 프로그램이 포함되어 있습니다.

+0

라이브러리가없는 다른 솔루션? – Codler

+1

글쎄, 당신은 도서관이 무엇을하는지 볼 수 있습니다. 정말 많은 코드가 아닙니다. 지금까지 내가 아는 한 당신은 버그/비 호환성을 "고칠"수 밖에 없습니다. 이 라이브러리는 테스트를 거쳤기 때문에 멋지며 정규 표현식에 대한 책을 작성한 현명한 사람이 작성했습니다 :-) – Pointy