2013-05-23 3 views
1

AJAX 응답을 구문 분석하고 body 태그의 ID를 얻으려고합니다. jQuery는 body 태그에 대한 DOM 응답을 에뮬레이션 할 수 없기 때문에 jQuery를 통해이 작업을 수행 할 수 없습니다.IE8이 내 정규식을 인식하지 못합니다.

저는 이것을 여러 줄로 나눠서 오류를 찾아 냈습니다. 이것은 최신 브라우저에서 작동하지만 IE8에서는 실패합니다.

var bodyIDregex = new RegExp(/<body[^>]*id=["'](.*?)["']>/gi), 
matched = html.match(bodyIDregex), 
bodyID = bodyIDregex.exec(matched[0]); 
bodyID = bodyID[1]; 

나는 변수 html의 값이 예상대로임을 확인했습니다.

어떤 도움이 필요합니까?

감사합니다.

+1

, 내 생각 엔') (이것은 "g"플래그와 첫'regex.exec를 호출 한 후 '.match (정규식)'호출과의 시퀀스 함께 할 수있는 뭔가가있다 같은 정규식으로. '.exec'는 여러 번 호출되어 연속적인 일치를 산출 할 수 있기 때문에 "g"플래그는 정규 표현식에서 상태를 벗어날 수 있습니다. 나는 당신이'.match()'호출을 위해 다른 정규 표현식을 사용할 것을 제안한다. (아마 "g"플래그없이). 일치하는 샘플 텍스트를 포함했다면이 사실을 확인할 수는 있었지만이를 사용하지 않고 그냥 추측하고 있습니다. – jfriend00

+0

@ paulsm4 : 틀렸어. 그런 식으로 jQuery는 실제로 결함이 있습니다. 전체 HTML 문서를 구문 분석 할 수 없습니다. 그리고 jQuery가 심지어 설계하지 않은 많은 것들이 있습니다 ... – Bergi

+0

HTML 문서가 아닌 XML 문서로 결과를 해석하도록 설정된 경우 jQuery가 body 태그를 구문 분석 할 수 있는지 여부는 흥미 롭습니다 ... 하지만 솔직히 말해서, 그 중 하나가 작동할지 모르겠습니다. 물론, 유효한 XML (XHTML) 인 HTML 문서가 있어야한다는 제한이 있습니다. 그리고 나는 HTML5에 글을 썼다. 때로는 슬래시를 닫지 않고 XML 문서에 필요하다. –

답변

5

정규 표현식의 생성자에 문자열을 전달해야합니다 (또는). 정규식 리터럴 구문을 사용하고 둘 다 사용할 수는 없습니다.

var bodyIDregex = /<body[^>]*id=["'](.*?)["']>/gi 

또는

var bodyIDregex = new RegExp("<body[^>]*id=[\"'](.*?)[\"']>","gi") 

업데이트 : 당신이 올바르게 대답에서 확인 된 것처럼, 문제가 정규식 검색이 마지막 문자의 위치에서 계속 사실에서 유래

이전 경기에서. 이 문제를 해결하는 한 가지 방법은 lastIndex를 재설정하는 것입니다,하지만 당신은 한 번만 문자열에 일치 할 필요가 있기 때문에이 경우 이것은 필요하지 않습니다 :

var bodyIDregex = /<body[^>]*id=["'](.*?)["']>/gi, 
    bodyID = bodyIDregex.exec(html); 

//bodyID is now the array, ["<body id="test">asdf</body>", "test"] 

alert(bodyID[1]); 
//alerts the captured group, "test" 
+0

잘 고맙습니다. 감사합니다. 불행히도, 그것은 여전히 ​​1이 null이거나 객체가 아니라고 말하는 나의 오류를 해결하지 못합니다. –

+0

@MMiller 참으로 이상 하네. 즉, IE8에서는 캡처 된 그룹이 성냥 배열의 항목으로 포함되지 않습니다. 오류의 정확한 텍스트를 게시 할 수 있습니까? –

+0

다음은 WriteCodeOnline.com에서 테스트 한 스크린 샷입니다 (JSfiddle은 IE8에서 작동하지 않습니까?). https://dl.dropboxusercontent.com/u/28836420/ie8.png –

2

를 분명히, 당신은 (정규식 개체) .match 전화 (문자열을), lastIndex라는 RegExp 객체의 속성을 증가시킵니다. RegExp 객체가 어떻게 작동하는지 완전히 알지 못하지만 나중에 exec() 메서드를 호출 할 때 문제가 발생합니다.

해결책은 분명히 lastIndex를 0으로 재설정하는 것입니다.

아사드는 말 외에
var html = '<html><body id="test">asdf</body></html>'; 

var bodyIDregex = /<body[^>]*id=["'](.*?)["']>/gi, 
matched = html.match(bodyIDregex); 
// Reset lastIndex 
bodyIDregex.lastIndex = 0; 
var bodyID = bodyIDregex.exec(matched[0]); 
alert(bodyID.length); 
bodyID = bodyID[1]; 

document.write(bodyID); // writes test 
+0

문제점을 해결하기위한 접근 방식으로 내 대답을 업데이트했습니다. –

관련 문제