2011-12-05 2 views
-1

은 가정 정규 표현식에 대한 도움이 필요 나는 HTML과 같은

<html> 
<Head> 
<link type="text/css" href="c1.css" rel="stylesheet" /> 
<link type="text/css" href="c2.css" rel="stylesheet" /> 
<link type="text/css" href="c3.css" rel="stylesheet" /> 
<link type="text/css" href="c4.css" rel="stylesheet" /> 
<link type="text/css" href="c5.css" rel="stylesheet" /> 

<script type="text/javascript" src="j1.js"></script> 
<script type="text/javascript" src="j2.js"></script> 
</Head> 

<body> 

<script type="text/javascript" src="j3.js"></script> 
<script type="text/javascript" src="j4.js"></script> 

</body> 
</html> 

먼저 내가 나에게 모든 링크 태그 디테일과 나에게 모든 스크립트 태그 세부 정보를 반환합니다 두번째 정규 표현식을 반환하는 정규식을 사용합니다. 나는 google를 찾는다. 그러나 는 적합하지 않다. 누구든지 두 정규식 패턴을 알고 있다면 알려 주시기 바랍니다. 덕분에

+0

무슨 '세부 사항'을 원하니? 속성 중 하나? 전체 태그? – Connell

+3

어떻게하면 정규식을 사용하는 것이 좋은 생각이라고 생각합니까? –

+3

왜 정규 표현식을 사용해야합니까? HTML 파서를 사용할 수없는 이유는 무엇입니까? – CanSpice

답변

2

다른 사람들이 주석을 달았으므로 정규 표현식을 사용하여 HTML을 구문 분석하는 것이 좋지 않을 수도 있지만 이것이 사용자가 요구 한 것입니다. 그래서 여기에 우리가 간다 :

link` 태그 '에 대한

정규 표현식

@"(?ix)" + 
@"<link\s*type=\x22(?'type'.*?)\x22\s*" + 
@"href=\x22(?'href'.*?)\x22\s*" + 
@"rel=\x22(?'rel'.*?)\x22\s*" + 
@"\/>"; 
script` 태그'에 대한

정규 표현식

@"(?ix)" + 
@"<script\s*type=\x22(?'type'.*?)\x22\s*" + 
@"src=\x22(?'src'.*?)\x22\s*" + 
@"><\/script>"; 

가정하면 당신은 당신의 HTML을 가지고 문자열 유형의 변수 :

public const string LINK_PATTERN = 
         @"(?ix)" + 
         @"<link\s*type=\x22(?<type>.*?)\x22\s*" + 
         @"href=\x22(?<href>.*?)\x22\s*" + 
         @"rel=\x22(?<rel>.*?)\x22\s*" + 
         @"\/>"; 

public const string SCRIPT_PATTERN = 
         @"(?ix)" + 
         @"<script\s*type=\x22(?<type>.*?)\x22\s*" + 
         @"src=\x22(?<src>.*?)\x22\s*" + 
         @"><\/script>"; 

static void Main(string[] args) 
{ 
    string html = getBody(); 

    Regex links = new Regex(LINK_PATTERN); 
    Regex scripts = new Regex(SCRIPT_PATTERN); 

    foreach (Match link in links.Matches(html)) 
    { 
     Console.WriteLine("<link>: " + link); 

     Console.WriteLine("\ttype: " + link.Groups["type"]); 
     Console.WriteLine("\thref: " + link.Groups["href"]); 
     Console.WriteLine("\trel: " + link.Groups["rel"]); 

     Console.WriteLine(""); 
    } 

    foreach (Match script in scripts.Matches(html)) 
    { 
     Console.WriteLine("<script>: " + script); 

     Console.WriteLine("\ttype: " + script.Groups["type"]); 
     Console.WriteLine("\tsrc: " + script.Groups["src"]); 

     Console.WriteLine(""); 
    } 

    Console.ReadKey(); 
} 

public static string getBody() 
{ 
    string html = ""; 

    html += "<html>"; 
    html += "<head>"; 
    html += "<link type=\"text/css\" href=\"c1.css\" rel=\"stylesheet\" />"; 
    html += "<link type=\"text/css\" href=\"c2.css\" rel=\"stylesheet\" />"; 
    html += "<link type=\"text/css\" href=\"c3.css\" rel=\"stylesheet\" />"; 
    html += "<link type=\"text/css\" href=\"c4.css\" rel=\"stylesheet\" />"; 
    html += "<link type=\"text/css\" href=\"c5.css\" rel=\"stylesheet\" />"; 
    html += "<script type=\"text/javascript\" src=\"j1.js\"></script>"; 
    html += "<script type=\"text/javascript\" src=\"j2.js\"></script>"; 
    html += "<body>"; 
    html += "<script type=\"text/javascript\" src=\"j3.js\"></script>"; 
    html += "<script type=\"text/javascript\" src=\"j4.js\"></script>"; 
    html += "</body>"; 
    html += "</html>"; 

    return html; 
} 
1

정규 표현식으로 HTML을 구문 분석하는 것은 좋지 않습니다. 올바르게 해석하려면 실제 파서가 필요합니다.

주어진 첫 번째 예제 텍스트로 작업 할 수는 있지만, 깨우쳐야하는 다음 텍스트에서 모든 '특별한 경우'를 다루기 위해 모든 깨우기 순간을 보내고있는 것처럼 보일 것입니다.

2

This 대답은 당신이 찾고있는 것입니다. regexes로 HTML을 구문 분석하지 마십시오.