2010-01-10 1 views
3

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

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

простой прелюдия

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

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

«рок-& ролл ".to_url => "рок-н-ролл"

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

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

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

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

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

"раскачивать это Español стиль" .to_url => "рок-он-Espanol стиле"

"рассказать своим читателям 你好" .to_url => «скажите, ваши читатели-Ni-хао»

+0

BillW, я не ищу именно этого, Я просто указывал пример того, что я имел в виду под интеллектуальной заменой, прежде чем кто-то разместил простое регулярное выражение (которое является решением, которое я уже использую). В частности, о части перевода мне все равно. – Pablo

+1

JPF, Прошу прощения за ваше главное намерение; рад, что ты получил то, что тебе нужно. Я поражен тем, что библиотека «stringex» в своем компоненте «ActsAsUrl» может обрабатывать случай одного или двух не-римских (китайский в вашем примере) глифов на английские фонемы! – BillW

ответ

0

Я не мог найти ни одну библиотеку, которая бы это делала, как в 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

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

0

Если цель состоит в том, чтобы сделать строку «безопасным» Я рекомендую Mirosoft's anti-xss libary

+0

Цель небезопасна, как в способе XSS, но безопасна, поскольку при копировании и вклеивании URL-адресов с ней просто работает, вводя их легко, будучи читабельным, будучи одной строкой для команд (не требуя каких-либо экранов) и т. Д. – Pablo

2

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

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", "-"); 
1

Из ваших примеров, ближе всего я «ве нашли (хотя я не думаю, что он делает все, что вы после этого) является:

My Favorite String Extension Methods in C#

, а также:

ÜberUtils - Part 3 : Strings

Поскольку ни одно из этих решений даст вам именно то, что вы после этого (происходит из примеров, в вашем вопросе) и предполагая, что цель здесь, чтобы ваша строка «безопасным», я бы второй совет Хогана и пойдите с Microsoft's Anti Cross Site Scripting Library или, по крайней мере, используйте это как основу для чего-то, что вы создаете сами, возможно, исходя из библиотеки.

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

Extension Methods for AntiXss

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

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

Improved C# Slug Generator

0

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

например.

public static string ToUrl(this string text) 
{ 
    return text.Trim().Regex.Replace(text, ..., ...); 
} 
0

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

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

2

Возможно, этот вопрос может помочь вам на вашем пути. Это дает вам код на том, как Stackoverflow генерирует его URL, (точнее, как имена вопросов превращаются в симпатичные URLs.

Link to Question here, where Jeff Atwood shows their code

0

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

public class Post 
{ 

    public string Subject { get; set; } 

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

} 
Смежные вопросы