ugrás a tartalomhoz

Slugify

olomhuszar · 2013. Júl. 10. (Sze), 22.19
Heló!

Mysql-ben lenne szükségem egy slugot(szép url-t) készítő függvényre.

Sajnos a rendszer aminél dolgozok egy asztali alkalmazást használ admin felületként, tehát az adatbázisba íráskor nem tudom a slugot elkészíteni, nem férek hozzá a forráskódhoz.

Tehát egy triggert kell használnom, az adatbázishoz hozzáférek.

A neten néztem már pár függvényt, azokkal általában az volt a probléma, hogy az ékezetes karaktereket ?-el helyettesítette.
 
1

És hol akadsz el, amikor a

Joó Ádám · 2013. Júl. 10. (Sze), 22.25
És hol akadsz el, amikor a fent hivatkozott megoldást át akarod írni, hogy ékezetes karakterekkel is működjön?
2

Ékezetek összehasonlítása.

olomhuszar · 2013. Júl. 12. (P), 16.12
Gondoltam azt a pár ékezetes és speciális karaktert, amik előfordulnak simán egyessével kicserélem.

Ehhez összehasonlítást akartam használni, de az ASCII(ő) és ASCII(ű) például ugyanazt azt eredményt adják(197).
És van, hogy más eredményt ad, hogyha mondjuk a mező értéke egy "ő" betű, és a függvénybe van beleírva az "ő" betű.
A tábla latin1_swedish_ci kódulású, és ezen nem tudok változtani.(másik, egy asztali alkalmazás is ezt az adatbázist használja)
3

Ehhez összehasonlítást

Joó Ádám · 2013. Júl. 12. (P), 16.33
Ehhez összehasonlítást akartam használni, de az ASCII(ő) és ASCII(ű) például ugyanazt azt eredményt adják(197).


Elolvastad az ASCII() dokumentációját? Le van benne írva, hogy az első bájt értékét adja vissza, ez UTF-8-nál az ő és az ű esetén is 197. Használd helyette az ORD()-ot.

És van, hogy más eredményt ad, hogyha mondjuk a mező értéke egy "ő" betű, és a függvénybe van beleírva az "ő" betű.


Ha csak nem svéd a forráskódod kódolása is, akkor ne várd, hogy a kettő megegyezzen. Konvertálj valahogy.
4

Működik

olomhuszar · 2013. Júl. 15. (H), 16.39
Köszönöm a segítséget.
Ha bárkinek kell(forrás fentebb):
  1. DROP FUNCTION IF EXISTS slugify;  
  2. DELIMITER ;;  
  3. CREATE FUNCTION slugify(dirty_string varchar(200))  
  4. RETURNS varchar(200) CHARSET latin1  
  5. DETERMINISTIC  
  6. BEGIN  
  7.     DECLARE x, y , z Int;  
  8.     Declare temp_string, allowed_chars, new_string VarChar(200);  
  9.     Declare is_allowed Bool;  
  10.     Declare c, check_char VarChar(1);  
  11.   
  12.     set allowed_chars = "abcdefghijklmnopqrstuvwxyz0123456789-";  
  13.     set temp_string = LOWER(dirty_string);  
  14.   
  15.     Select temp_string Regexp('&'Into x;  
  16.     If x = 1 Then  
  17.         Set temp_string = replace(temp_string, '&'' and ');  
  18.     End If;  
  19.   
  20.     Select temp_string Regexp('[^a-z0-9]+'into x;  
  21.     If x = 1 then  
  22.         set z = 1;  
  23.         While z <= Char_length(temp_string) Do  
  24.             Set c = Substring(temp_string, z, 1);  
  25.             Set is_allowed = False;  
  26.             Set y = 1;  
  27.   
  28.             If ( ( strCmp(c,'Á') = 0) Or  ( strCmp(c,'á') = 0) ) Then  
  29.                 Set temp_string = Replace(temp_string, c, 'a');  
  30.             End If;  
  31.             If ( ( strCmp(c,'É') = 0) Or ( strCmp(c,'é') = 0) ) Then  
  32.                 Set temp_string = Replace(temp_string, c, 'e');  
  33.             End If;  
  34.             If ( ( strCmp(c,'í') = 0) Or ( strCmp(c,'Í') = 0) ) Then  
  35.                 Set temp_string = Replace(temp_string, c, 'i');  
  36.             End If;  
  37.             If ( ( strCmp(c,'õ') = 0) Or ( strCmp(c,'ó') = 0) Or ( strCmp(c,'ö') = 0) Or ( strCmp(c,'Õ') = 0) Or ( strCmp(c,'Ö') = 0) Or ( strCmp(c,'Ó') = 0)) Then  
  38.                 Set temp_string = Replace(temp_string, c, 'o');  
  39.             End If;  
  40.             If ( strCmp(c,'Ú') = 0) Or ( strCmp(c,'Ü') = 0) Or ( strCmp(c,'Û') = 0) Or ( strCmp(c,'ú') = 0) Or ( strCmp(c,'ü') = 0) Or ( strCmp(c,'û') = 0) Then  
  41.                 Set temp_string = Replace(temp_string, c, 'u');  
  42.             End If;  
  43.   
  44.             Inner_Check: While y <= Char_length(allowed_chars) Do  
  45.                 If ( strCmp( ascii(Substring(allowed_chars,y,1)), Ascii(c) ) = 0) Then  
  46.                     Set is_allowed = True;  
  47.                     Leave Inner_Check;  
  48.                 End If;  
  49.                 Set y = y + 1;  
  50.             End While;  
  51.             If is_allowed = False Then  
  52.                 Set temp_string = Replace(temp_string, c, '-');  
  53.             End If;  
  54.             set z = z + 1;  
  55.         End While;  
  56.     End If;  
  57.   
  58.     Select temp_string Regexp("^-|-$|'"into x;  
  59.     If x = 1 Then  
  60.         Set temp_string = Replace(temp_string, "'", '');  
  61.         Set z = Char_length(temp_string);  
  62.         Set y = Char_length(temp_string);  
  63.         Dash_check: While z > 1 Do  
  64.             If Strcmp(SubString(temp_string, -1, 1), '-') = 0 Then  
  65.                 Set temp_string = Substring(temp_string,1, y-1);  
  66.                 Set y = y - 1;  
  67.             Else  
  68.                 Leave Dash_check;  
  69.             End If;  
  70.             Set z = z - 1;  
  71.         End While;  
  72.     End If;  
  73.   
  74.     Repeat  
  75.         Select temp_string Regexp("--"into x;  
  76.         If x = 1 Then  
  77.             Set temp_string = Replace(temp_string, "--""-");  
  78.         End If;  
  79.     Until x <> 1 End Repeat;  
  80.   
  81.     Return temp_string;  
  82. END;;  
  83. DELIMITER ;  
Latin-1-es ő és ű betűt használ, hogyha más kell, ki kell cserélni.