2010-02-11 16 views
3

<을 그대로두고 전체 텍스트를 인코딩해야합니다.Asp.net C#에서 HTML을 인코딩하지만 태그는 그대로 두십시오.

예를

<p>Give me 100.000 €!</p> 

이 될해야합니다

<p>Give me 100.000 &euro;!</p> 

HTML 태그가

+0

절대적으로 이러한 값을 인코딩해야합니까, 아니면 모든 것을 유니 코드로 출력 할 수 있습니까? 정말 텍스트를 인코딩해야한다면 아마 당신은 Html Agility Pack을 거쳐야한다고 말할 것입니다. 그러나 MIME 유형을 올바르게 설정하면 €는 유효한 유니 코드 문자입니다. –

답변

1

은 어쩌면 당신은 인코딩하고자하는 바로 그 문자를하려면 string.replace를 사용하여 그대로 유지해야 하는가?

+0

이 방법이 최선의 방법입니다. OP가 ASCII가 아닌 엔티티를 인코딩하려고 시도하는 것 같습니다 (문자 세트 문제를 해결하기 위해). 이를 위해 127을 넘는 정규 표현식을 사용하고 알려진 엔티티 이름으로 대체하는 것이 가장 좋습니다. 또는 더 나은 아직, 그 charset 문제를 분류하는 경우 근본적인 문제입니다. :-) –

+1

또는 그 반대입니다. 먼저 모든 것을 인코딩하고 <en>으로 돌아 가기 < and > – MichaelD

2

당신은 Html Agility Pack을 위해 이동 한 다음 대해 HTMLEncode에 추가로 지정된 HtmlTextWriter를 사용할 수있는 태그

+0

+1 -이 방법은 대체 또는 정규식으로 문제를 해결하는 데있어 대부분의 문제를 해결한다고 생각합니다. 무시할 수있는 태그 목록이나 문자를 만드는 것보다 작업이 적을 것 같습니다. 바꾸다. – RedFilter

0

의 값을 인코딩 할 수 있습니다. 따라서 HtmlTextWriter를 사용하여 <p></p>을 설정 한 다음 HtmlEncode를 사용하여 <p></p>의 본문을 설정하면됩니다. HtmlTextWriter는 ToString()을 허용합니다. 많은 다른 코드를 사용하지 않아야합니다. 다른 제안

html = Regex.Replace(
    html, 
    "(<[^>]+>|[^<]+)", 
    m => m.Value.StartsWith("<") ? m.Value : HttpUtility.HtmlEncode(m.Value) 
); 
1

사이에 무슨 태그 또는 무엇 태그 사이에, 그리고 인코딩 중 하나와 일치하는 정규 표현식을 사용합니다.

public static class HtmlTextEncoder 
{ 
    public static string HtmlEncode(string html) 
    { 
     if (html == null) return null; 

     var doc = new HtmlDocument(); 
     doc.LoadHtml(html); 

     EncodeNode(doc.DocumentNode); 

     doc.OptionWriteEmptyNodes = true; 
     using (var s = new MemoryStream()) 
     { 
      doc.Save(s); 
      var encoded = doc.Encoding.GetString(s.ToArray()); 
      return encoded; 
     } 
    } 

    private static void EncodeNode(HtmlNode node) 
    { 
     if (node.HasChildNodes) 
     { 
      foreach (var childNode in node.ChildNodes) 
      { 
       if (childNode.NodeType == HtmlNodeType.Text) 
       { 
        childNode.InnerHtml = HttpUtility.HtmlEncode(childNode.InnerHtml); 
       } 
       else 
       { 
        EncodeNode(childNode); 
       } 
      } 
     } 
     else if (node.NodeType == HtmlNodeType.Text) 
     { 
      node.InnerHtml = HttpUtility.HtmlEncode(node.InnerHtml); 
     } 
    } 
} 

이것은 HTML의 모든 노드를 반복하고 텍스트 노드를 HTML로 인코딩 된 텍스트로 바꿉니다.

나는 .NET fiddle to demonstrate this technique을 만들었습니다.

관련 문제