Удалите все проблемные символы в C # - PullRequest
3 голосов
/ 10 января 2010

Существует ли библиотека .Net, которая удаляет все проблемные символы строки и оставляет только буквенно-цифровые символы, дефисы и подчеркивания (или аналогичные подмножества) интеллектуальным способом? Это для использования в URL, именах файлов и т. Д.

Я ищу что-то похожее на stringex , которое может делать следующее:

Простая прелюдия

"простой английский" .to_url => «Простой английский»

"это вообще ничего" .to_url => "Не его-ничего-на-все"

"рок-н-ролл" .to_url => "Рок-н-ролл"

Давайте похвастаться

"Мощность рубина на $ 12" .to_url => "12-доллары-стоит-из-рубиновой силы"

"10% скидка, если вы действуете сейчас" .to_url => "10 процентов-офф-если-ты-акт-сейчас"

Ты даже не хочешь доверять Iconv для этой следующей части

"kick it en Français" .to_url => "Кик-это-ан-Francais"

"Рок это испанский стиль" .to_url => "Рок-он-Espanol стиль"

"Расскажите своим читателям 你好" .to_url => "Скажите, ваши читатели-Ni-хао"

Ответы [ 9 ]

3 голосов
/ 10 января 2010

Вы можете попробовать это

string str = phrase.ToLower();  //optional
str = str.Trim();
str = Regex.Replace(str, @"[^a-z0-9\s_]", ""); // invalid chars        
str = Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space
str = str.Substring(0, str.Length <= 400 ? str.Length : 400).Trim(); // cut and trim it
str = Regex.Replace(str, @"\s", "-");
2 голосов
/ 10 января 2010

Возможно, этот вопрос поможет вам на вашем пути. Он дает вам код о том, как Stackoverflow генерирует свои URL-адреса (более конкретно, как имена вопросов превращаются в красивые URL-адреса.

Ссылка на вопрос здесь, где Джефф Этвуд показывает их код

1 голос
/ 10 января 2010

Из ваших примеров самая близкая вещь, которую я нашел (хотя я не думаю, что она делает все, что вам нужно):

Мои любимые методы расширения строки в C #

, а также:

ÜberUtils - Часть 3. Струны

Поскольку ни одно из этих решений не даст вам именно того, что вам нужно (исходя из примеров в вашем вопросе), и при условии, что цель здесь состоит в том, чтобы сделать вашу строку "безопасной", я бы поддержал совет Хогана и пошел с Библиотека межсайтовых сценариев Microsoft , или, по крайней мере, используйте это как основу для чего-то, что вы создаете сами, возможно, из библиотеки.

Вот ссылка на класс, который создает ряд методов расширения строк (как в первых двух примерах), но использует библиотеку Microsoft AntiXSS:

Методы расширения для AntiXss

Конечно, вы всегда можете объединить алгоритмы (или аналогичные), используемые в библиотеке AntiXSS, с алгоритмами, которые часто используются на веб-сайтах для генерации URL-адресов «слаг» (во многом как в Stack Overflow и во многих блог-платформах) .

Вот пример хорошего генератора слагов C #:

Улучшенный генератор слизней C #

0 голосов
/ 22 мая 2010

Я не смог найти ни одной библиотеки, которая бы это делала, как в Ruby, поэтому я закончил писать свой собственный метод. Это на всякий случай:

/// <summary>
/// Turn a string into something that's URL and Google friendly.
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ForUrl(this string str) {
  return str.ForUrl(true);
}
public static string ForUrl(this string str, bool MakeLowerCase) {
  // Go to lowercase.
  if (MakeLowerCase) {
    str = str.ToLower();
  }

  // Replace accented characters for the closest ones:
  char[] from = "ÂÃÄÀÁÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöøùúûüýÿ".ToCharArray();
  char[] to = "AAAAAACEEEEIIIIDNOOOOOOUUUUYaaaaaaceeeeiiiidnoooooouuuuyy".ToCharArray();
  for (int i = 0; i < from.Length; i++) {
    str = str.Replace(from[i], to[i]);
  }

  // Thorn http://en.wikipedia.org/wiki/%C3%9E
  str = str.Replace("Þ", "TH");
  str = str.Replace("þ", "th");

  // Eszett http://en.wikipedia.org/wiki/%C3%9F
  str = str.Replace("ß", "ss");

  // AE http://en.wikipedia.org/wiki/%C3%86
  str = str.Replace("Æ", "AE");
  str = str.Replace("æ", "ae");

  // Esperanto http://en.wikipedia.org/wiki/Esperanto_orthography
  from = "ĈĜĤĴŜŬĉĝĥĵŝŭ".ToCharArray();
  to = "CXGXHXJXSXUXcxgxhxjxsxux".ToCharArray();
  for (int i = 0; i < from.Length; i++) {
    str = str.Replace(from[i].ToString(), "{0}{1}".Args(to[i*2], to[i*2+1]));
  }

  // Currencies.
  str = new Regex(@"([¢€£\$])([0-9\.,]+)").Replace(str, @"$2 $1");
  str = str.Replace("¢", "cents");
  str = str.Replace("€", "euros");
  str = str.Replace("£", "pounds");
  str = str.Replace("$", "dollars");

  // Ands
  str = str.Replace("&", " and ");

  // More aesthetically pleasing contractions
  str = str.Replace("'", "");
  str = str.Replace("’", "");

  // Except alphanumeric, everything else is a dash.
  str = new Regex(@"[^A-Za-z0-9-]").Replace(str, "-");

  // Remove dashes at the begining or end.
  str = str.Trim("-".ToCharArray());

  // Compact duplicated dashes.
  str = new Regex("-+").Replace(str, "-");

  // Let's url-encode just in case.
  return str.UrlEncode();
}
0 голосов
/ 10 января 2010

Я использую что-то подобное в своем блоге.

public class Post
{

    public string Subject { get; set; }

    public string ResolveSubjectForUrl()
    {
        return Regex.Replace(Regex.Replace(this.Subject.ToLower(), "[^\\w]", "-"), "[-]{2,}", "-");
    }

}
0 голосов
/ 10 января 2010

Что-то, что версия Ruby не проясняет (но оригинальная версия Perl делает), - то, что алгоритм, который она использует для транслитерации нелатинских символов, преднамеренно упрощен - «лучше, чем ничего» в обоих смыслах. Например, хотя он имеет ограниченную возможность транслитерации китайских символов, он полностью нечувствителен к контексту - поэтому, если вы передадите ему японский текст, вы получите бред.

Преимущество этого упрощенного характера заключается в том, что его реализация довольно тривиальна. У вас просто есть большая таблица символов Unicode и соответствующие им ASCII-эквиваленты. Вы можете извлечь это прямо из исходного кода Perl (или Ruby), если решите реализовать эту функцию самостоятельно.

0 голосов
/ 10 января 2010

Не будет библиотеки, способной на то, что вы хотите, поскольку вы устанавливаете конкретные правила, которые вы хотите применить, например, $ х => х-долларов, х% => х-процентов. Вам почти наверняка придется написать свой собственный метод для достижения этой цели. Это не должно быть слишком сложно. Метод расширения строки и использование одного или нескольких регулярных выражений для выполнения замен, вероятно, будет довольно хорошим и лаконичным способом сделать это.

, например

public static string ToUrl(this string text)
{
    return text.Trim().Regex.Replace(text, ..., ...);
}
0 голосов
/ 10 января 2010

Если цель состоит в том, чтобы сделать строку "безопасной", я рекомендую Библиотека Mirosoft anti-xss

0 голосов
/ 10 января 2010

Вы можете использовать HTTPUtility.UrlEncode, но это закодирует все, а не заменит или удалит проблемные символы. Таким образом, ваши пробелы будут + и 'также будут закодированы. Не решение, но, возможно, отправная точка

...