wtorek, 25 września 2012

Usuwanie "brzydkich" znaczków z tabeli i duplikatów


W tym poście chciałam opisać coź z czym ostatnio miałam do czynienia w pracy, mianowicie usuwanie "brzydkich" znaków ze słów w tabeli, które kiedyś "wkradły się" do niej poprzez złe kodowanie w aplikacji.
Na wszelki wypadek zrobiłam kopie tej tabeli, a następnie mając listę znaków do zamiany, wykonałam następujące polecenia:
UPDATE slowa_clean SET slowo = REPLACE(slowo,'?','ż');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'e','ę');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'±','ą');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'3','ł');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'n','ń');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'¶','ś');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'a','ć');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'1','ź');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'—','Ż');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'E','Ę');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'!','Ą');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'L','Ł');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'N','Ń');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'¦','Ś');
UPDATE slowa_clean SET slowo = REPLACE(slowo,'A','Ć');

Z uwagi na to, że w mojej tabelce pojawiło się kilka zdublowanych słów (niektóre dobre dodały się już w obecnym dobrym kodowaniu), należało pozbyć się zduplikowanych wierszy, aby to zrobić stworzyłam nową tabelę i wykonałam następujące polecenie:
INSERT INTO slowa_clean2 SELECT * FROM slowa_clean GROUP BY slowo;
Na końcu podmieniłam nową tabelkę ze zmianami, a starą zachowałam pod inną nazwą (na wszelki wypadek ;) ). Natomiast tabelkę roboczą slowa_clean usunęłam.

RENAME TABLE slowa TO slowa_old;
RENAME TABLE slowa_clean2 TO slowa;

Oczywiście najlepiej pilnować, aby w ogóle nie musieć tego robić, czyli dbać o prawidłowe wprowadzanie danych do bazy :P

piątek, 14 września 2012

Wyrażenia regularne i RegExr

W pracy bardzo często przydaje się znajomość wyrażeń regularnych. Do tworzenia i testowania wyrażeń regularnych przydaje się świetny programik o nazwie RegExr. Można z niego skorzystać tutaj: http://gskinner.com/RegExr/ lub pobrać wersję desktopową z tego adresu: http://gskinner.com/RegExr/desktop/

A teraz kilka wyrażeń regularnych z wykorzystaniem w konkretnych metodach w C# :)

Metoda wyszukująca linki i podmieniająca je na znaczniki html:

public static string FormatURL(string str)
        {
            string url = string.Empty;
            Regex reg = new Regex("([^=\"<'])(http(s)?://([\\w+?\\.\\w+])+([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\/\\?\\.\\:\\;\\'\\,]*)?)", RegexOptions.IgnoreCase);
            Match m = reg.Match(str);
            if (m.Groups[1].Value != "") url = m.Groups[2].Value;
            str = reg.Replace(str, "$1<a href=\"$2\" target=\"_blank\" rel=\"nofollow\">$2</a>");
            return str;
        }


Kolejny przykład to dwie funkcje, które umożliwiają formatowanie treści ze znacznikami bbcode na naszej stronie :)

Formatowanie znacznika bbcode dla cytatu:


public static string FormatCytatu(string str)
        {
            Regex reg = new Regex(@"(\[quote=([\w .-]*)\])", RegexOptions.IgnoreCase);
            str = reg.Replace(str, "<div class=\"quote_box\"><div style=\"margin: 5px;\"><b>$2 napisał(a):</b><br /><i>");
            str = str.Replace("[/quote]", "</i></div></div>");
            return str;
        }



Funkcja formatująca czcionkę:

public static string FormatCzcionki(string str)
        {
            Regex reg = new Regex(@"(\[color=([a-zA-Z]*)\])", RegexOptions.IgnoreCase);
            str = reg.Replace(str, "<font color=\"$2\">");
            str = str.Replace("[/color]", "</font>")
            return str;
        }