2014-02-10 5 views
0

이름은 기억이 나지 않지만 RegExp 개체 내에서 이미 일치하는 문자열을 참조 할 수 있다고 생각합니다. 내가 뭘 원하는 정규 표현식은 그때 배열에서 모든 개별 경기를 넣어 재귀 함수를 사용합니다, 단지 같은 태그를 일치시킬 수 있어야한다 주어진 문자열 예javascript regexp 일치하는 태그 이름

<ul><li>something in the list</li></ul> 

내의 모든 태그를 일치합니다. 첫 번째 경기를 참조 할 수 있다면 작동해야하는 정규식이 될 것입니다.

var s = '<ul><li>something in the list</li></ul>'; 
s.match(/<([^>]+)><([^>]+)>(.*?)<\/\2><\/\1>/) 
// => ["<ul><li>something in the list</li></ul>", 
//  "ul", 
//  "li", 
//  "something in the list"] 

결과는 다음과 같습니다

var reg = /(?:<(.*)>(.*)<(?:FIRST_MATCH)\/>)/g; 

일치 된 배열은 다음 어떤 도움

match[0] = "<ul><li>something in the list</li></ul>"; 
match[1] = "ul"; 
match[2] = ""; // no text to match 
match[3] = "li"; 
match[4] = "something in the list"; 

감사를 포함해야

답변

2

당신이 역 참조 (\1, \2)을 의미하는 것 같아 당신이 원하는 것과 정확히 일치하지는 않습니다. 그러나 요점은 뒤로 참조 \1, \2이 이전 그룹과 일치하는 문자열과 일치한다는 것입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 작동하지 않습니다. 나는 당신이 게시하고 Javascript에서 역 참조가 불가능하다는 것을 발견 한 이후로 계속 읽고 있습니다. 어쩌면 나는'String.replace()'에서 함수를 넘겨 줄 수 있고 첫 번째 태그 이름을 가진 다른 대체 문자를 실행할 수있다. 배열에서 그 문자열을 밀어 낸다. 나는 그것을 작동시킬 수 있는지를 알 것이다. – synthet1c

+0

@ synthet1c, 작동하지 않습니까? 역 참조는 자바 스크립트에서 가능합니다. http://ideone.com/sdmFmq (예제 실행)를 참조하십시오. 또한 [MDN의 정규 표현식 가이드] (https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions)를 참조하십시오 (페이지에서'뒤로 참조 찾기) – falsetru

+0

, 훌륭하게 작동합니다. 당신의 도움을 주셔서 감사합니다 – synthet1c

1

정규 표현식을 사용하여 HTML을 구문 분석 할 수 없습니다 (HTML 파싱에 정규 표현식이 표현할 수있는 유한 상태 자동 완성보다 더 강력한 유형의 자동 완성이 필요하기 때문에 자세한 내용에 관심이있는 경우 FSA와 FST 비교).

특정 문제에 대해 해킹 할 수는 있지만 자바를 사용하여 HTML을 안정적으로 구문 분석하려면 다른 방법이 있습니다. 웹 검색 : parse html javascript 및이를 수행하는 방법에 대한 많은 정보를 얻을 수 있습니다.

0

더러운 해결 방법을 만들었습니다. 아직도 일하는 생각이 필요합니다.

var str = '<div><ul id="list"><li class="something">this is the text</li></ul></div>'; 

function parseHTMLFromString(str){ 
    var structure = []; 
    var matches = []; 
    var reg = /(<(.+)(?:\s([^>]+))*>)(.*)<\/\2>/; 
    str.replace(reg, function(){ 
     //console.log(arguments); 
     matches.push(arguments[4]); 
     structure.push(arguments[1], arguments[4]); 
    }); 
    while(matches.length){ 
     matches.shift().replace(reg, function(){ 
      console.log(arguments); 
      structure.pop(); 
      structure.push(arguments[1], arguments[4]); 
      matches.push(arguments[4]); 
     }); 
    } 
    return structure; 
} 

// parseHTMLFromString(str); // ["<div>", "<ul id="list">", "<li class="something">", "this is the text"]