How To/

Convert diacritic characters to non-diacritic ones in PHP

How to change diacritic chars

This function changes diacritic characters to non-diacritic ones. It is useful for creating urls. Some characters like space, colon, semicolon etc. are converted to dashes.

Second optional parameters setc character case.

Sourcecode

function str_to_url($s, $case=0){
	$acc =	'É	Ê	Ë	š	Ì	Í	ƒ	œ	µ	Î	Ï	ž	Ð	Ÿ	Ñ	Ò	Ó	Ô	Š	£	Õ	Ö	Œ	¥	Ø	Ž	§	À	Ù	Á	Ú	Â	Û	Ã	Ü	Ä	Ý	';
	$str =	'E	E	E	s	I	I	f	o	m	I	I	z	D	Y	N	O	O	O	S	L	O	O	O	Y	O	Z	S	A	U	A	U	A	U	A	U	A	Y	';
	$acc.=	'Å	Æ	ß	Ç	à	È	á	â	û	Ĕ	ĭ	ņ	ş	Ÿ	ã	ü	ĕ	Į	Ň	Š	Ź	ä	ý	Ė	į	ň	š	ź	å	þ	ė	İ	ʼn	Ţ	Ż	æ	ÿ	';
	$str.=	'A	A	S	C	a	E	a	a	u	E	i	n	s	Y	a	u	e	I	N	S	Z	a	y	E	i	n	s	z	a	p	e	I	n	T	Z	a	y	';
	$acc.=	'Ę	ı	Ŋ	ţ	ż	ç	Ā	ę	IJ	ŋ	Ť	Ž	è	ā	Ě	ij	Ō	ť	ž	é	Ă	ě	Ĵ	ō	Ŧ	ſ	ê	ă	Ĝ	ĵ	Ŏ	ŧ	ë	Ą	ĝ	Ķ	ŏ	';
	$str.=	'E	l	n	t	z	c	A	e	I	n	T	Z	e	a	E	i	O	t	z	e	A	e	J	o	T	i	e	a	G	j	O	t	e	A	g	K	o	';
	$acc.=	'Ũ	ì	ą	Ğ	ķ	Ő	ũ	í	Ć	ğ	ĸ	ő	Ū	î	ć	Ġ	Ĺ	Œ	ū	ï	Ĉ	ġ	ĺ	œ	Ŭ	ð	ĉ	Ģ	Ļ	Ŕ	ŭ	ñ	Ċ	ģ	ļ	ŕ	Ů	';
	$str.=	'U	i	a	G	k	O	u	i	C	g	k	o	U	i	c	G	L	O	u	i	C	g	l	o	U	o	c	G	L	R	u	n	C	g	l	r	U	';
	$acc.=	'ò	ċ	Ĥ	Ľ	Ŗ	ů	ó	Č	ĥ	ľ	ŗ	Ű	ô	č	Ħ	Ŀ	Ř	ű	õ	Ď	ħ	ŀ	ř	Ų	ö	ď	Ĩ	Ł	Ś	ų	Đ	ĩ	ł	ś	Ŵ	ø	đ	';
	$str.=	'o	c	H	L	R	u	o	C	h	l	r	U	o	c	H	L	R	u	o	D	h	l	r	U	o	d	I	L	S	c	D	i	l	s	W	o	d	';
	$acc.=	'Ī	Ń	Ŝ	ŵ	ù	Ē	ī	ń	ŝ	Ŷ	Ə	ú	ē	Ĭ	Ņ	Ş	ŷ	 	:	;	.	,';
	$str.=	'I	N	S	w	u	E	i	n	s	Y	e	u	e	I	N	S	y	-	-	-	-	-';

	$out = str_replace(explode("\t", $acc), explode("\t", $str), $s);

	if($case == -1){
		return strtolower(preg_replace('/[^a-zA-Z0-9_-]/', '', $out));
	}else if($case == 1){
		return strtoupper(preg_replace('/[^a-zA-Z0-9_-]/', '', $out));
	}else{
		return preg_replace('/[^a-zA-Z0-9_-]/', '', $out);
	}
}

echo str_to_url('zażółć GęŚLĄ JAŹń!!!', -1);

Strip accents in javascript

Here is javascript verion.

function stripAccents(s, c){
    var $acc, $str, o, r, i

    // if character case for output string is not set set it to -1 (lowercase)
    if (typeof(c)=='undefined'){
      c = -1;
    }

    // convertion table. It can be copied from PHP source.
	$acc =	'É	Ê	Ë	š	Ì	Í	ƒ	œ	µ	Î	Ï	ž	Ð	Ÿ	Ñ	Ò	Ó	Ô	Š	£	Õ	Ö	Œ	¥	Ø	Ž	§	À	Ù	Á	Ú	Â	Û	Ã	Ü	Ä	Ý	';
	$str =	'E	E	E	s	I	I	f	o	m	I	I	z	D	Y	N	O	O	O	S	L	O	O	O	Y	O	Z	S	A	U	A	U	A	U	A	U	A	Y	';
	$acc+=	'Å	Æ	ß	Ç	à	È	á	â	û	Ĕ	ĭ	ņ	ş	Ÿ	ã	ü	ĕ	Į	Ň	Š	Ź	ä	ý	Ė	į	ň	š	ź	å	þ	ė	İ	ʼn	Ţ	Ż	æ	ÿ	';
	$str+=	'A	A	S	C	a	E	a	a	u	E	i	n	s	Y	a	u	e	I	N	S	Z	a	y	E	i	n	s	z	a	p	e	I	n	T	Z	a	y	';
	$acc+=	'Ę	ı	Ŋ	ţ	ż	ç	Ā	ę	IJ	ŋ	Ť	Ž	è	ā	Ě	ij	Ō	ť	ž	é	Ă	ě	Ĵ	ō	Ŧ	ſ	ê	ă	Ĝ	ĵ	Ŏ	ŧ	ë	Ą	ĝ	Ķ	ŏ	';
	$str+=	'E	l	n	t	z	c	A	e	I	n	T	Z	e	a	E	i	O	t	z	e	A	e	J	o	T	i	e	a	G	j	O	t	e	A	g	K	o	';
	$acc+=	'Ũ	ì	ą	Ğ	ķ	Ő	ũ	í	Ć	ğ	ĸ	ő	Ū	î	ć	Ġ	Ĺ	Œ	ū	ï	Ĉ	ġ	ĺ	œ	Ŭ	ð	ĉ	Ģ	Ļ	Ŕ	ŭ	ñ	Ċ	ģ	ļ	ŕ	Ů	';
	$str+=	'U	i	a	G	k	O	u	i	C	g	k	o	U	i	c	G	L	O	u	i	C	g	l	o	U	o	c	G	L	R	u	n	C	g	l	r	U	';
	$acc+=	'ò	ċ	Ĥ	Ľ	Ŗ	ů	ó	Č	ĥ	ľ	ŗ	Ű	ô	č	Ħ	Ŀ	Ř	ű	õ	Ď	ħ	ŀ	ř	Ų	ö	ď	Ĩ	Ł	Ś	ų	Đ	ĩ	ł	ś	Ŵ	ø	đ	';
	$str+=	'o	c	H	L	R	u	o	C	h	l	r	U	o	c	H	L	R	u	o	D	h	l	r	U	o	d	I	L	S	c	D	i	l	s	W	o	d	';
	$acc+=	'Ī	Ń	Ŝ	ŵ	ù	Ē	ī	ń	ŝ	Ŷ	Ə	ú	ē	Ĭ	Ņ	Ş	ŷ	 	:	;	.	,';
	$str+=	'I	N	S	w	u	E	i	n	s	Y	e	u	e	I	N	S	y	_	_	_	_	_';

    // If charactes wasn't in convertion table and it is not a [a-zA-z0-9_-] convert it to this char
    o = '';

    // convert convertion tables into arrays
    var ta = $acc.split("\t");
    var ts = $str.split("\t");

    // iterate over convertion tables and replace every char in string
    for (i = 0; i < ta.length; i++){
      r = new RegExp('[' + ta[i] + ']', 'g');
      s = s.replace(r, ts[i]);
    }

    // remove every character not found in convertion table
    s = s.replace(/[^a-zA-Z0-9_-]/gi, o);

    // some optimization - you can change it if you change conversion tables
    // here I replace multiple underscores into one undercore and strip
    // underscores at begining and ehd of string
    s = s.replace(/[_]+/, '_');
    s = s.replace(/^_*(.*?)_*$/gi, '$1')

    // return converted string
	if(c == -1){
		return s.toLowerCase();
	}else if(c == 1){
		return s.toUpperCase();
	}else{
		return s;
	}
}