Как HtmlEncode только текстовое содержимое в строке HTML? - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть некоторый HTML-контент, который я хотел бы проанализировать и закодировать перед его отображением на моих веб-страницах.

Хитрость в том, что я хочу кодировать только текстовое содержимое, а не очевидные теги HTML в содержимом HTML. Как мне этого добиться?

Пример:

При условии

"Some text & links : <strong>bla blà blö</strong> and <a href="http://www.google.com">go there</a> for only 15 € < 20 €"

Я бы хотел вывести

"Some text &amp; links : <strong>bla bl&agrave; bl&ouml;</strong> and <a href="http://www.google.com">go there</a> for only 15 &euro; &lt; 20 &euro;"
or
"Some text &#38; links : <strong>bla bl&#224; bl&#246;</strong> and <a href="http://www.google.com">go there</a> for only 15 &#8364; &#60; 20 &#8364;"

Ответы [ 2 ]

1 голос
/ 07 января 2012

Используйте Html Agility Pack :

var html = 
  "Some text & links : <strong>bla blà blö</strong> and <a href=\"http://www.google.com\">go there</a> for only 15 € < 20 €";

// This
HtmlAgilityPack.HtmlEntity.Entitize(html);

// Outputs
Some text & links : <strong>bla bl&agrave; bl&ouml;</strong> and <a href="http://www.google.com">go there</a> for only 15 &euro; < 20 &euro;

Только что протестировал его, и он отлично работает на вашем примере.

Если вы хотите увидеть, как это делается, это 1009 * общественное *.

0 голосов
/ 04 апреля 2019

Я знаю, что это старая тема, но я думаю, что этот фрагмент может хорошо сработать. Я также знаю, что вы не должны использовать RegEx для тегов HTML (так как он вообще не обращается к <script> и <style>), но этот метод может быть тем, что вам нужно, вместо того, чтобы получать весь пакет HTMLAgilityPack .... использовал SqlString, потому что этот метод используется моей базой данных SQL Server. Может быть легко переключен на строку. Также легко изменить на StringBuilder, чтобы сделать его более оптимальным.

private static SqlString fnHTMLDecodeEncode(SqlString html, bool encode)
{
  if (html.IsNull)
    return SqlString.Null;

  const RegexOptions REGOPT = RegexOptions.Singleline | RegexOptions.Compiled;

  string s = html.Value;
  var m = Regex.Matches(s, @"(<[!A-Za-z\/][^>]*>", RegexOptions.Singleline |   RegexOptions.Compiled);
  int proStart, proLen;
  if (m.Count == 0)
  {
    proStart = 0;
    proLen = s.Length;
  }
  else
  {
    proStart = m[m.Count - 1].Index + m[m.Count - 1].Length;
    proLen = s.Length - proStart;
  }

  for (int i = m.Count; i >= 0; i--)
  {
    if (i < m.Count)
    {
        proStart = (i == 0 ? 0 : m[i - 1].Index + m[i - 1].Length);
        proLen = m[i].Index - proStart;
    }

    if (proLen > 2)
    {
        var orig = s.Substring(proStart, proLen);
        var enc = (encode ? System.Net.WebUtility.HtmlEncode(orig) : System.Net.WebUtility.HtmlDecode(orig));
        if (orig.Length != enc.Length)
        {
            s = s.Remove(proStart, proLen).Insert(proStart, enc);
        }

        proLen = -1;
    }

  }

  return new SqlString(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...