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):

DROP FUNCTION IF EXISTS slugify;
DELIMITER ;;
CREATE FUNCTION slugify(dirty_string varchar(200))
RETURNS varchar(200) CHARSET latin1
DETERMINISTIC
BEGIN
	DECLARE x, y , z Int;
	Declare temp_string, allowed_chars, new_string VarChar(200);
	Declare is_allowed Bool;
	Declare c, check_char VarChar(1);

	set allowed_chars = "abcdefghijklmnopqrstuvwxyz0123456789-";
	set temp_string = LOWER(dirty_string);

	Select temp_string Regexp('&') Into x;
	If x = 1 Then
		Set temp_string = replace(temp_string, '&', ' and ');
	End If;

	Select temp_string Regexp('[^a-z0-9]+') into x;
	If x = 1 then
		set z = 1;
		While z <= Char_length(temp_string) Do
			Set c = Substring(temp_string, z, 1);
			Set is_allowed = False;
			Set y = 1;

			If ( ( strCmp(c,'Á') = 0) Or  ( strCmp(c,'á') = 0) ) Then
				Set temp_string = Replace(temp_string, c, 'a');
			End If;
			If ( ( strCmp(c,'É') = 0) Or ( strCmp(c,'é') = 0) ) Then
				Set temp_string = Replace(temp_string, c, 'e');
			End If;
			If ( ( strCmp(c,'í') = 0) Or ( strCmp(c,'Í') = 0) ) Then
				Set temp_string = Replace(temp_string, c, 'i');
			End If;
			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
				Set temp_string = Replace(temp_string, c, 'o');
			End If;
			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
				Set temp_string = Replace(temp_string, c, 'u');
			End If;

			Inner_Check: While y <= Char_length(allowed_chars) Do
				If ( strCmp( ascii(Substring(allowed_chars,y,1)), Ascii(c) ) = 0) Then
					Set is_allowed = True;
					Leave Inner_Check;
				End If;
				Set y = y + 1;
			End While;
			If is_allowed = False Then
				Set temp_string = Replace(temp_string, c, '-');
			End If;
			set z = z + 1;
		End While;
	End If;

	Select temp_string Regexp("^-|-$|'") into x;
	If x = 1 Then
		Set temp_string = Replace(temp_string, "'", '');
		Set z = Char_length(temp_string);
		Set y = Char_length(temp_string);
		Dash_check: While z > 1 Do
			If Strcmp(SubString(temp_string, -1, 1), '-') = 0 Then
				Set temp_string = Substring(temp_string,1, y-1);
				Set y = y - 1;
			Else
				Leave Dash_check;
			End If;
			Set z = z - 1;
		End While;
	End If;

	Repeat
		Select temp_string Regexp("--") into x;
		If x = 1 Then
			Set temp_string = Replace(temp_string, "--", "-");
		End If;
	Until x <> 1 End Repeat;

	Return temp_string;
END;;
DELIMITER ;
Latin-1-es ő és ű betűt használ, hogyha más kell, ki kell cserélni.