2014-09-17 2 views
0

Google의 CMS는 URL에 쉼표 문자를 인코딩하는 것으로 가정합니다. 따라서 "? values ​​= 1,2,3"이 아닌 CMS는 "? values ​​= 1 % 2c2 % 2c3"을 렌더링합니다. 이 자체는 문제가되지 않지만 이러한 링크가 가리키는 외부 시스템은 인코딩 된 쉼표를 처리 할 수 ​​없으며 쿼리 문자열에 실제 쉼표를 전달하는 경우에만 작동합니다.정규식을 사용하여 href에서 동일한 문자열이 여러 번 나타나는 경우

이미 HTML 사전 렌더링을 처리하고 비 XHTML 호환 마크 업을 정리하는 Regex 정리 도구가 있습니다. 이것은 ASP.Net v2에서 실행되는 오래된 CMS입니다.

내 질문에 쉼표에 대해 "% 2c"의 모든 항목을 교체하는 데 필요한 정규식이 있지만이 텍스트가 앵커 태그 내에있는 경우에만 해당됩니다. % 2c의 모든 인스턴스를 쉽게 바꿀 수 있었지만 URL이 아닌 목적으로 해당 문자열이 사용 된 경우 다른 곳에서 페이지가 손상 될 위험이 있습니다.

.Net 및 System.Text.RegularExpressions를 사용하고 있습니다. 모든 찾기 및 바꾸기 규칙을 포함하는 XML 파일이 있습니다. 이것은 런타임에로드되고 HTML을 정리합니다. 각 규칙은 다음과 같이 구성됩니다.

  • 찾을 텍스트 - 예 : "<script> "
  • 텍스트 교체 - 예를 들어, 우리는 다음 각 규칙을 통해 루프와 않는 일부 C 번호를

"<script type='text/javascript'>"이 :.

// HTML = full page HTML 
Regex regex = new Regex(searchTxt, RegexOptions.IgnoreCase); 
HTML = regex.Replace(HTML, replaceTxt); 

간단한 난 그냥 수 없습니다 우리의 특정 시나리오에 대한 올바른 정규식 구문을 얻을. 당신의 도움을 위해

많은 감사합니다. 여기

가 빌려입니다 당신이 원하는 무엇

^(?!<a href=").*(*SKIP)(*FAIL)|(%2c) 

: .NET은 PCRE의 정규식이 같은 것을 할 수있는 지원한다면 희망이 내 시나리오

class Program 
{ 
    static void Main(string[] args) 
    { 
     string html = GetPageHTML(); 
     string regexString = "(<a href=).*|(%2c)"; 
     string replaceTxt = ","; 

     RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline; 
     Regex regex = new Regex(regexString, options); 

     // We are currently using a simple regex.Replace 
     string cleanHTML = regex.Replace(html, replaceTxt); 

     // But for this example should we be doing something with the Matches collection? 
     foreach (Match match in regex.Matches(html)) 
     { 
      if (match.Success) 
      { 
       // do something? 
      } 
     } 

    } 

    private static string GetPageHTML() 
    { 
     return @"<html> 
        <head></head> 
        <body> 
         <a title='' href='http://www.testsite.com/?x=491191%2cy=291740%2czoom=6%2cbase=demo%2clayers=%2csearch=text:WE9%203QA%2cfade=false%2cmX=0%2cmY=0' target='_blank'>A link</a> 
         <p>We wouldn't want this (%2c) to be replaced</p> 
        </body> 
       </html>"; 
    } 
} 
+0

HttpServerUtility.UrlDecode 시도 했습니까? – Tushar

+0

아니요. 제가 할 수있는 메모리에 문자열의 인스턴스가 없습니다. 나는 HTML 페이지 전체를 가지고 정규 표현식을 사용하여 찾기 및 바꾸기를 효과적으로 수행 할 수 있습니다. –

답변

2

을 설명 LETE C# 콘솔 응용 프로그램. 위 정규식 태그는 %2c와 일치합니다. 하지만 regex를 사용하면 regex discard 기술에 약간의 논리를 더하면 같은 결과를 얻을 수 있습니다. 당신이 할 수있는, 그래서

^(?!<a href=").*|(%2c) 

Working demo

enter image description here

: 당신이 정규식 이하로 사용하는 경우

, 당신은 %2c 일치하고 또한 앵커 태그 내에있는 %2c 문자열을 캡처 할 수 있습니다 논리를 추가하고 캡처 그룹 내용이 %2c과 같은지 확인하는 것입니다. 앵커 태그의 %2c과 일치합니다. 그런 다음이를 쉼표로 바꿀 수 있습니다.

관련 문제