2010-12-15 2 views
0

피드 버너는 자신의 블로그 서비스 리턴이 유사한 자바 스크립트의 블록을 반환하는 결과 변경에 :의 x3c 등을 포함하는 피드 버너 결과를 디코딩하는 방법 너무

document.write를을 ("\ x3cdiv 클래스 \ X3D \ x22feedburnerFeedBlock \ x22 id \ x3d \ x22RitterInsuranceMarketingRSSv3iugf6igask14fl8ok645b6l0 \ x22 \ x3e "); document.write ("\ x3cul \ x3e"); document.write를 ("\ x3cli \ X3E \ x3cspan 클래스 \ X3D \ x22headline \ X22 \ X3E \ x3ca href가 \ X3D \

나는이 중 원시 HTML을 원하는 X22. 이전에 내가 할 수 있었다 쉽게 사용할 수 있습니다. document.write 구문을 쪼개려면 replace를 사용합니다. 그러나 C#을 사용하여 디코딩하는 방법을 알지 못합니다.

편집 : 음, 이것은 세미 악몽이었습니다. 마침내 해결하기 위해, 여기에 내가 제공 한 어떤 개선점이 있어도 무엇이 발생 했는가?

public static char ConvertHexToASCII(this string hex) 
{ 
    if (hex == null) throw new ArgumentNullException(hex); 
    return (char)Convert.ToByte(hex, 16); 
} 

.

private string DecodeFeedburnerHtml(string html) 
{ 
    var builder = new StringBuilder(html.Length); 
    var stack = new Stack<char>(4); 
    foreach (var chr in html) 
    { 
     switch (chr) 
     { 
      case '\\': 
       if (stack.Count == 0) 
       { 
        stack.Push(chr); 
       } 
       else 
       { 
        stack.Clear(); 
        builder.Append(chr); 
       } 
       break; 
      case 'x': 
       if (stack.Count == 1) 
       { 
        stack.Push(chr); 
       } 
       else 
       { 
        stack.Clear(); 
        builder.Append(chr); 
       } 
       break; 
      default: 
       if (stack.Count >= 2) 
       { 
        stack.Push(chr); 

        if (stack.Count == 4) 
        { 
         //get stack[3]stack[4] 
         string hexString = string.Format("{1}{0}", stack.Pop(), 
                stack.Pop()); 

         builder.Append(hexString.ConvertHexToASCII()); 
         stack.Clear(); 
        } 
       } 
       else 
       { 
        builder.Append(chr); 
       } 
       break; 
     } 
    } 

    html = builder.ToString(); 
    return html; 
} 

내가 더 잘할 수 있는지 잘 모릅니다. 어떤 이유에서든이 코드는 선형 시간 알고리즘인데도 필자는 항상 더러움을 느낍니다. 얼마나 오래 있어야하는지에 관한 것입니다. PHP는 나뭇 가지 인코딩입니다

답변

1

16 진수로 인코딩 된 ASCII 값처럼 보입니다. 문자열을 탐색 할 수 있으며 \x 다음에 두 개의 16 진수 (0-9, a-f)가 나오는 경우 해당 ASCII 문자로 바꿉니다. 문자열이 길면 String.Replace() 대신에 StringBuilder에 증분 결과를 저장하는 것이 더 빠릅니다.

인코딩 사양을 모르지만 따르는 규칙이 더 많을 수 있습니다 (예 : \\이 리터럴 \의 이스케이프 문자 인 경우).

0

:

http://www.twig-project.org/

당신은 C#을 사용하고 있기 때문에 당신은 가능성이 가장 높은 사람들을 변환 할 .Replace() 문자열 일련의 메서드를 사용하여 다음 기호를 번역 할 수있는 사전을 만들어야합니다 HTML 문자로 돌아갑니다.

다른 방법으로는 해당 데이터를 파일에 저장하고 Perl 스크립트를 실행하여 텍스트를 디코딩 한 다음 C#의 파일에서 읽을 수 있지만 비용이 더들 수 있습니다.

+0

듣기 위해 놀랍게 우울합니다. –

관련 문제