Алексей Качаев | Web-developer, фрилансер, менеджер

PHP, jQuery, AJAX, CodeIgniter, ZendFramework, Web2.0, блоггинг, Wordpress, бизнес, StartUp, Инветоры, web-проекты, бизнес-идеи, фриланс, интерфейсы

PHP и JavaScript: парочка полезных функций

Опубликовано: Алексей Качаев |

Уверен, что у каждого программиста есть свой hot list полезных функций, которые должны быть постоянно под рукой. У меня в этот list входят также несколько конструкций, классов и интерфейсов, которыми я часто пользуюсь. В планах - добавить сюда же некоторые полезные алгоритмы. Но это позже… Сейчас хочу поделиться двумя функциями с вами, может кто-то возьмет эти функции себе на вооружение, может кто-то предложит более эффективные!

аutoencode() - простое декодирование строки

Итак, начнем с пары функций, которые я постоянно использую для управления кодировкой. Про эту функцию мне напомнил в комментариях к прошлому посту читатель none. Проблема в том, что при использовании в приложениях jQuery ajax-запросов нужно следить за тем, чтобы кодировка “жестко равнялась” UTF. Иногда этого добиться очень сложно. Например, у меня в прошлом примере база работала в кодировке cp1251, а отдавать результат нужно в UTF-8.. Но это только пол проблемы, немного поднапрягшись можно “переделать” базу данных. Но иногда

а) это невозможно
б) мы заранее не знаем в какой кодировке получим входные данные (например, реализуем класс для использования в стороннем коде)

В этих случаях можно пользоваться связкой таких функций:

function is_utf8($string) { 
/*
** Функция определяет является ли строка UTF
*/
	for ($i=0; $i<strlen($string); $i++) { 
		if (ord($string[$i]) < 0x80) continue; 
		elseif ((ord($string[$i]) & 0xE0) == 0xC0) $n=1; 
		elseif ((ord($string[$i]) & 0xF0) == 0xE0) $n=2; 
		elseif ((ord($string[$i]) & 0xF8) == 0xF0) $n=3; 
		elseif ((ord($string[$i]) & 0xFC) == 0xF8) $n=4; 
		elseif ((ord($string[$i]) & 0xFE) == 0xFC) $n=5; 
		else return false; 
 
		for ($j=0; $j<$n; $j++) { 
			if ((++$i == strlen($string)) || ((ord($string[$i]) & 0xC0) != 0x80)) return false; 
		}	 
	} 
	return true; 
}
 
function autoencode($string, $encoding='utf-8') { 
/*
** Декодирует строку в указанную кодировку
*/
	if (is_utf8($string)) $detect='utf-8'; 
	else { 
		$cp1251=0; 
		$koi8u=0; 
		$strlen=strlen($string); 
		for($i=0;$i<$strlen;$i++) { 
			$code=ord($string[$i]); 
			if (($code>223 and $code<256) or ($code==179) or ($code==180) or ($code==186) or ($code==191)) $cp1251++; // а-я, і, ґ, є, Ї 
			if (($code>191 and $code<224) or ($code==164) or ($code==166) or ($code==167) or ($code==173)) $koi8u++; // а-я, є, і, ї, ґ 
		} 
		if ($cp1251>$koi8u) $detect='windows-1251'; 
		else $detect='koi8-u'; 
	} 
	if ($encoding==$detect) return $string; 
	else return iconv($detect, $encoding."//TRANSLIT", $string); 
}

Аналог str_replace() для JavaScript

Функцию str_replace() для PHP я использую достаточно часто. Она настолько удобна, что когда я пишу на JavaScript, иногда чувствую себя связанным по рукам и ногам. :) Поэтому пользуюсь вот этим чудным аналогом от Kevin van Zonneveld (функция принимает те же параметры и возвращает тот же результат).

function str_replace ( search, replace, subject ) {
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
 
    if(!(replace instanceof Array)){
        replace=new Array(replace);
        if(search instanceof Array){//If search    is an array and replace    is a string, then this replacement string is used for every value of search
            while(search.length>replace.length){
                replace[replace.length]=replace[0];
            }
        }
    }
 
    if(!(search instanceof Array))search=new Array(search);
    while(search.length>replace.length){//If replace    has fewer values than search , then an empty string is used for the rest of replacement values
        replace[replace.length]='';
    }
 
    if(subject instanceof Array){//If subject is an array, then the search and replace is performed with every entry of subject , and the return value is an array as well.
        for(k in subject){
            subject[k]=str_replace(search,replace,subject[k]);
        }
        return subject;
    }
 
    for(var k=0; k<search.length; k++){
        var i = subject.indexOf(search[k]);
        while(i>-1){
            subject = subject.replace(search[k], replace[k]);
            i = subject.indexOf(search[k],i);
        }
    }
 
    return subject;
 
}

Спонсор поста: Ищите кому доверить свой сайт? Комплексная оптимизация сайтов и раскрутка сайтов.

Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!

Также читайте по теме:

12 комментариев на “PHP и JavaScript: парочка полезных функций”

  1. спасибо мне помогло :)

  2. Спасибо, пригодятся функции :-)
    хотя я на стороне сервера предпочитаю использовать iconv() и всё :-)

  3. НОНЕ а я уже давно перестал использовать iconv

  4. Моя функція autoencode пішла в народ))))
    http://mrgall.com/blog/2008/02/13/autoencode/
    А навіщо додавати //TRANSLIT ?

  5. Щас отказался от iconv он менее удобен

  6. MrGALL интересная у вас функция :-)

  7. Спасибо за аutoencode() - закрыл у себя тикет!

  8. [...] про финкризис. Качаев реально по понятиям нима базара отпехапечил! И ты хош в постовойшвили? На кой те нужно такое [...]

  9. [...] про финкризис. Качаев реально по понятиям нима базара отпехапечил! И ты хош в постовойшвили? На кой те нужно такое [...]

  10. [...] про финкризис. Качаев реально по понятиям нима базара отпехапечил! И ты хош в постовойшвили? На кой те нужно такое [...]

  11. Спасибо! То, что нужно!

  12. Спасибо, всегда не хватало этой функции в яваскрипте -))

Оставьте комментарий