2009-11-17 5 views
1

내가 뭘 잘못하고 있는지 잘 모르겠다. 내가 asp.net regex.replace를 사용하려고하지만 그것은 잘못된 항목을 교체 유지합니다.Regex에서 내가 뭘 잘못하고 있니?

저는 2 개의 대체품이 있습니다. 첫 번째 것은 내가 원하는 것을 대체합니다. 거의 대칭 이미지 인 다음 교체가 내가 원하는 것을 대체하지 않습니다.

그래서이 내 샘플 코드

<%@ Page Title="Tour" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> 
    <title>Website Portfolio Section - VisionWebCS</title> 
    <meta name="description" content="A" /> 
    <meta name="keywords" content="B" /> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <!-- **START** --> 

나는 메타 태그를 모두 대체 할 찾고있다. 내 코드에서

<meta name=\"description\" content=\"A\" /> 
<meta name=\"keywords\" content=\"B\" /> 

먼저 나는 나의 다음 작업이하지 않는이

<meta name=\"description\" content=\"D\" /> 

과 설명 메타 태그를 대체하는이 작동

<meta name=\"keywords\" content=\"C\" /> 

와 키워드를 메타 태그를 교체 대신 "키워드"메타 태그를 대체 한 다음 "설명"태그를 대체합니다.

여기 내 테스트 프로그램이므로 모두 시도해 볼 수 있습니다. 바로 C# 콘솔 응용 프로그램에서 그것을 통해.

private const string META_DESCRIPTION_REGEX = "<\\s* meta \\s* name=\"description\" \\s* content=\"(?<Description>.*)\" \\s* />"; 
     private const string META_KEYWORDS_REGEX = "<\\s* meta \\s* name=\"keywords\" \\s* content=\"(?<Keywords>.*)\" \\s* />"; 
     private static RegexOptions regexOptions = RegexOptions.IgnoreCase 
            | RegexOptions.Multiline 
            | RegexOptions.CultureInvariant 
            | RegexOptions.IgnorePatternWhitespace 
            | RegexOptions.Compiled; 

     static void Main(string[] args) 
     { 

      string text = "<%@ Page Title=\"Tour\" Language=\"C#\" MasterPageFile=\"~/Views/Shared/Site.Master\" Inherits=\"System.Web.Mvc.ViewPage\" %><asp:Content ID=\"Content1\" ContentPlaceHolderID=\"HeadContent\" runat=\"server\"> <title>Website Portfolio Section - VisionWebCS</title> <meta name=\"description\" content=\"A\" /> <meta name=\"keywords\" content=\"B\" /></asp:Content><asp:Content ID=\"Content2\" ContentPlaceHolderID=\"MainContent\" runat=\"server\"><!-- **START** -->"; 
      Regex regex = new Regex(META_KEYWORDS_REGEX, regexOptions); 
      string newKeywords = String.Format("<meta name=\"keywords\" content=\"{0}\" />", "C"); 
      string output = regex.Replace(text, newKeywords); 

      Regex regex2 = new Regex(META_DESCRIPTION_REGEX, regexOptions); 
      string newDescription = String.Format("<meta name=\"description\" content=\"{0}\" />", "D"); 
      string newOutput = regex2.Replace(output, newDescription); 
      Console.WriteLine(newOutput); 
     } 

이 나에게

<%@ Page Title="Tour" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage" %> 
<asp:Content ID="Content1" ContentPlaceHold erID="HeadContent" runat="server"> 
    <title>Website Portfolio Section - VisionW 
     ebCS</title> 
    <meta name="description" content="D" /> 
</asp:Content> 
<asp:Conten t ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <!-- **START** 
    --> 

감사합니다 당신이 잘못하고 무엇

답변

6

불필요한 생활 교습없이 질문에 대답하기 위해 탐욕스러운 한정어로 인해 문제가 발생합니다. 물음표 추가하여 게으른 제작을 시도해보십시오

<meta\\s+?name=\"description\"\\s+?content=\"(?<Description>.*?)\"\\s*?/> 

이 정규식은 세상의 모든 페이지에 대한 작동하지만 당신이 필요로하는 경우에 당신의 자신의 템플릿에 대한 몇 가지 빠른 교체 스크립트를하지 않습니다 물론, 정규식입니다 빠르고 가장 쉬운 솔루션과 방법.

+0

작동하지만 잘 모르겠습니다. 나는 욕심쟁이 한정어를 사용하고 있지만 "/>"을보고 멈출 때까지 계속 될 것이라고 생각했습니다. 그러면 왜 더 나아질까요? 이것이 얼마나 많은 표정을 지니고 있는지를 체크 할 때조차도 언제나처럼 돌아 왔습니다. – chobo2

7

의 최종 출력을 얻는다? 너는 parsing HTML with a regex! .NET 용

권장 라이브러리 : HTML Agility Pack

+0

그래서 - 대신, 그 다음 무엇을 할 것인가? –

+1

@Will : +1하지만 적절한 파서로 구문 분석하는 방법에 대한 링크/코드 스 니펫을 제공합니다. – RageZ

+0

그래픽만으로도 충분히 재미있어졌습니다. – bobby

0

이 알아 사랑하고, DOM을 사용합니다. W3C (HTML 표준 본문)가 XML (HTML은 XML의 하위 집합) 문서를 구문 분석하기 위해 승인 된 방법입니다. 입력 HTML이 끔찍한 잘못이라고 생각할 충분한 이유가없는 한, 이는 대개 가장 좋은 방법입니다.

Learn here

당신은 매우 Walkthrough: Accessing the DHTML DOM from C#

당신은 또한 매우 쉽게 DOM을 검색 할 수 있습니다로, jQuery를 시도 할 수 있습니다를 확인하는 것이 좋습니다. Like so.

1

@ serg555의 답변에 동의합니다. - 문제는 탐욕스러운 한정어로 - '게으른가?''나는 C# 코드에서 URL의 설명을 필요로 내 정규식 코드를 확인하기 위해 this site을 사용

<meta\\s*name=\"description\"\\s*content=\"(?<Description>.*?)\"\\s*/> 
0

문제를 해결해야한다.

이 내 마지막 작업 지사입니다 :

 WebClient x = new WebClient { Encoding = Encoding.UTF8 }; 
      string source = x.DownloadString(url); 

      string description = Regex.Match(source, "<meta[^>]*name=[\"|\']description[\"|\'][^>]*content=[\"]([^\"]*)[\"][^>]*>", RegexOptions.IgnoreCase).Groups[1].Value; 
관련 문제