21 мая, 10:47
PHP: заменить последнее вхождение слова
function str_lreplace($search, $replace, $subject){ $pos = strrpos($subject, $search); if($pos !== false) { $subject = substr_replace($subject, $replace, $pos, strlen($search)); } return $subject; }
нет комментариев
15 февраля 2013, 19:58
javascript: ip to long / long to ip
function dot2num(dot)
{
var d = dot.split('.');
return ((((((+d[0])*256)+(+d[1]) )*256)+(+d[2]) )*256)+(+d[3]);
}
function num2dot(num)
{
var d = num%256;
for (var i = 3; i > 0; i--)
{
num = Math.floor(num/256);
d = num%256 + '.' + d;
}
return d;
}
6 января 2013, 5:30
jQuery dot in ID selector? точка в селекторе по айди не работет! Опа? :)
$('#with\\.dot')
4 января 2013, 0:48
Chrome javascript jquery: выполняем jsonp с сайта без Access-Control -Allow-Origin : *
При написании екстеншенов(аддонов) к хрому, частенько нужно данные выдирать с других сайтов. Сам же аддон должен работать на всех сайтах, даже на тех, на которых нет Access-Control -Allow-Origin : *. (В таких случаях просто получить ответ из-за ошибки не можем, а функция jsonp с самого аддона не предопределяется). Делаем просто jquery запрос (можно и без него), но функцию колбека определим через head.
var script = document.createElement('script'); script.textContent = 'addinfo = function(data){alert(data)}'; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script); $.ajax({"url":"https://some.com/get.json?id="+id, type: 'GET', async: false, contentType: "application/json", dataType: 'jsonp', jsonpCallback: "addinfo", success: function() {} });
4 января 2013, 0:40
Javascript: Декодируем полученый аджаксом юникод
function qp_decode (str) { var r = /\\u([\d\w]{4})/gi; str = str.replace(r, function (match, grp) { return String.fromCharCode(parseInt(grp, 16)); }); return unescape(str); }
22 декабря 2012, 18:52
JavaScript: Проверка на 404
function UrlExists(url) { var http = new XMLHttpRequest(); http.open('HEAD', url, false); http.send(); return http.status!=404; }
24 ноября 2012, 3:09
Javascript: вставляем с буфера картинку в документ (Google Chrome)
document.onpaste = function(event){ var items = event.clipboardData.items; document.write(JSON.stringify(items)); var blob = items[0].getAsFile(); var reader = new FileReader(); reader.onload = function(event){ document.write("<img src='"+event.target.result+"'/>") }; // data url! reader.readAsDataURL(blob); }зы: Для Фокса можно использовать просто contenteditable=’true’ и уже с него считывать картинку
12 ноября 2012, 14:07
PHP: мультибайтовою строку в массив с букв (multibyte string to array of letters)
Не думал что может быть такая проблема, но explode(’’,$string) не работал вообще, а mb_split глючил
Уже почти забыл, как пользоваться движком блога, мде :)
preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
Уже почти забыл, как пользоваться движком блога, мде :)
1 августа 2012, 13:10
apache folder / file list 2 (pure javascript :)
Пристыдили меня в предыдущем посте, что для мелких движений использовал монстра jQuery в 100кб, пришлось вспоминать родной javascript :)
Теперь без задержки в 1 секунду для загрузки jQuery :D
Букмарклет:
зы: только букмарклет ведет себя странно, разберусь попозже :)
Теперь без задержки в 1 секунду для загрузки jQuery :D
var inArray = Array.prototype.indexOf ? function (arr, val) { return arr.indexOf(val) != -1; } : function (arr, val) { var i = arr.length; while (i--) { if (a[i] === val) return true; } return false; }, a = document.getElementsByTagName("a"), i = a.length; while(i--){ if (inArray(["png","jpg","jpeg","gif"], a[i].href.split(".").pop())){ a[i].innerHTML = "<img src='"+a[i].href+"' alt='"+a[i].innerHTML+"'/>"; } }
Букмарклет:
зы: только букмарклет ведет себя странно, разберусь попозже :)
29 июля 2012, 22:08
apache folder / file list
Частенько в последнее время натыкаюсь на апачевые списки файлов, картинок, а их там десятки, и что бы найти нужный необходимо «все проклацать», написал небольшой скриптец для фаербага, что ссылки на картинки превращает в картинки рядом:
А впоследствии и букмарклет:
var s = document.createElement('script'); s.setAttribute('type','text/javascript'); s.setAttribute('src',"http://code.jquery.com/jquery-1.7.2.min.js"); document.getElementsByTagName('head')[0].appendChild(s); function l2i() { $("a[href$=png],a[href$=jpg],a[href$=gif],a[href$=jpeg]").each( function(){ $(this).append("<br/><img src='"+$(this).attr("href")+"' alt='"+$(this).text()+"'/>"); } ); }; setTimeout(l2i,1000);
А впоследствии и букмарклет:
9 июня 2012, 17:10
PHP: функции жрут память, заменим часть
Хорошая статья на эту тему у болка, скопирую «выводы»:
# занесение элемента в массив: array_push($stack, $element); $stack[] = $element; # получение версии ПХП, есть ещё # PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION, PHP_VERSION_ID и PHP_EXTRA_VERSION if (phpversion() === "5.0.0") {} if (PHP_VERSION === "5.0.0") {} # способ подключения ПХП if (php_sapi_name() === 'cli') {} if (PHP_SAPI === 'cli') {} # проверка существования ключа, но, увы, это не одно и тоже: # isset не покажет true, если ключ существует, но значение null if (array_key_exists('key1', $arr) && array_key_exists('key2', $arr)) {} if (isset($arr['key'], $arr['key2'])) {} # для массивов, ключи которых не перекрываются (операция «+» добавит только те ключи, # которые отсутствуют в первом массиве) $arr = array_merge($arr1, $arr2); $arr = $arr1 + $arr2; # операционная система if (php_uname('s') === 'Darwin') {} if (PHP_OS === 'Darwin') {} # получение переменной окружения. Есть отличие: массив $_ENV может быть перезаписан другим кодом, # при этом реальное значение переменной окружения не изменится, кроме того, # getevn не сгенерирует предупреждение, если значения с таким ключом нет if (getenv('VARNAME') === 'value') {} if ($_ENV['VARNAME'] === 'value') {}
5 июня 2012, 14:01
UTF Code points to UTF8
html_entity_decode(preg_replace("/\\\\u([0-9a-fA-F]+)/", "&#x$1;", json_encode($array)), ENT_COMPAT, 'UTF-8');
16 мая 2012, 17:40
Типы СУБД
- реляционные: MySQL, Oracle, Microsoft SQL Server, PostgreSQL;
- различные варианты хеш-таблиц key-value (Redis, BigTable, memcached);
- документо-ориентированные базы данных (MongoDB, CouchDB);
- базы данных, основанные на графах (Neo4j, Sones GraphDB);
- объектно-ориентированные базы данных (db4o, Cache, Jade);
- XML-ориентированные базы данных (eXist, BaseX).
24 февраля 2012, 16:05
CSS3: анимация на примере вращения картинки вокруг своей оси :)
ЦСС3 крутая вещь, круче не придумать ;)
анимировать будем при наведении мыши на картинку
анимировать будем при наведении мыши на картинку
@keyframes rotate{ /* создаем анимацию и даем ей имя (rotate например) */ /* дальше задаем положение в начале и в конце */ from { /* для анимации используем трансформацию вращение есть ешё сдвиг translate(x,y) и увеличение scale(z) */ transform: rotate(0); /* можно анимировать размеры и прочие парамтры цсс */ } to { transform: rotate(360deg); } /* или вместо from|to пишем процент выполнения сцены, от 0% до 100%, любой нужный */ /* так как поддерживают анимацию передовики Гекко и ВебКит, запись выше не работает и каждому нужно написать свою */ } @-moz-keyframes rotate{from {-moz-transform: rotate(0);} to {-moz-transform: rotate(360deg);}} @-webkit-keyframes rotate{from {-webkit-transform: rotate(0);} to {-webkit-transform: rotate(360deg);}} img { padding-right: 13px; } img:hover { /* анимировать будем при наведении мыши на картинку */ border: 1px solid #C0C0C0; /* имя анимации, длительность, продолжительность циклов, "задержки" */ animation: rotate 0.5s infinite linear; -moz-animation: rotate 0.5s infinite linear; -webkit-animation: rotate 0.5s infinite linear; /* -webkit-animation-name — имя анимации -webkit-animation-duration — время проигрывания анимации -webkit-animation-timing-function — метод расчета промежуточных значений свойств для анимации -webkit-animation-delay — задержка анимации -webkit-animation-iteration-count — количество циклов анимации -webkit-animation-direction — направление анимации -webkit-animation-play-state — проигрывается ли анимация или стоит на паузе */}
19 февраля 2012, 16:21
jQuery: Как получить значение css %параметра% блока в процентах
В чем проблема? Все, кроме вебкита, заданный параметр в процентах, например #wrp {left: 150%;}, возвращают в пикселях.
В примере параметром будет left, а для ИЕ как всегда костыль ;)
$(document).ready(function() { var lft = $('#wrp').css("left")+""; if (lft.match("px")) { lft = parseInt(lft) / $('#wrp').parent().width()*100; if ($.browser.msie) lft = lft>0 ? Math.ceil(lft) : Math.floor(lft); lft += "%"; } $('#out span').html(lft); });
В примере параметром будет left, а для ИЕ как всегда костыль ;)
25 января 2012, 15:52
ИЕ8 и тени со скругленными уголками вместе
Для тени очень хорошо работает свойство фильтр, но как только пытаешься применить к блоку с тенью какой нить хтц плагин для скругленных уголков или дд_раунди, это блок и разработчик тоже получают дикий баттхерт, потому что тень теперь у текста, блок стал выше на длину тени, но зато есть уголки. Пришлось на коленке писать приблуду, которая почему-то не хочет работать в ИЕ7, нужно наверное там джиквери с 1.4.2 обновить до 1.7.1
<!--[if lte IE 8]>
<script type="text/javascript" src="<?=SITE_TEMPLATE_PATH?>/roundie.js"></script>
<script type="text/javascript">
if (document.all) {
DD_roundies.addRule('.div-onmain .n-det, .div-onmain .news-list, #t-m ', '3px');
}
$(document).ready(function() {
$(".div-onmain .news-list, #t-m").each(function(){
var
w = $(this).innerWidth(),
h = $(this).innerHeight();
$(this).css({
"z-index":3,
"overflow": "visible",
"margin-top": -h*1+15 + "px"
});
$(this).parent().css({
"z-index":1
});
$(this).before(
$("<div class='shadow'>­</div>").css({
"z-index":2,
"margin-top": "-15px",
"overflow": "hidden",
"width": w,
"height": h,
"overflow": "visible"
})
);
});
$(".shadow").css({
"background": "#fff",
"filter": "progid:DXImageTransform.Microsoft.Shadow(color='#EEEEEE', Direction=0, Strength=15)"
});
});
</script>
<![endif]-->
5 января 2012, 23:42
JavaScript: определяем браузер по работе с масивами

<script type="text/javascript"> function browser() { if(-[1,]){ var f = 1; var d={4294967296:'opera', d:'firefox', 4294967295:'chrome', '1' :''}; for(var i in d) if(f) f=0; else return d[i]; } else return 'ie'; } document.write(browser()); </script>
Найдено на хабре
5 января 2012, 23:33
С новым годом
[][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+
!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+
([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+
!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+
([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
(([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])[+!![]]+
([]+[][{}])[-~[]]+([]+{})[~[]+(+!![]<<!![]+!![]+
!![])]+([]+![])[!![]+!![]+!![]]+([]+![])[!![]<<!![]+
!![]]+([]+![])[!![]+!![]]+([]+![])[-[]])()
[([{}-{}]+[])[-~[]]+([]+![])[!![]+!![]]+([]+![])
[!![]<<!![]+!![]]+([]+!![])[-~[]]+([]+!![])[+[]]](
[][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+
!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+
([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
[([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+
([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+
([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])[+!![]]]
(([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])
[+!![]]+([]+[][{}])[-~[]]+([]+{})[~[]+(+!![]<<!![]+
!![]+!![])]+([]+![])[!![]+!![]+!![]]+([]+![])
[!![]<<!![]+!![]]+([]+![])[!![]+!![]]+([]+![])
[-[]])()[([]+![])[-~[]]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+{})[!![]+!![]]](([]+![])[-~[]]+
([][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])
[+![]]+([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+
([]+{})[-~[]+(!![]<<!![]+!![])]+([]+!![])[+![]]+
([]+{})[-~[]]+ ([]+!![])[+!![]]]+[])[(-~[]+[+![]])-!![]])+
([]+![])[-~[]]+
(/!/[([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+([]+[][{}])
[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+!![])[+!![]]]+[])[+!![]+[!![]<<!![]-~[]]]+
(/!/[([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+([]+[][{}])
[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+([]+!![])[+!![]]+([]+!![])
[-[~[]+~[]]]+([]+{})[-~[]+(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})
[-~[]]+([]+!![])[+!![]]]+[])[+!![]+[!![]<<!![]-~[]]]+
([]+[~[]/[]])[[[!![]+!![]]*[!![]+!![]]]*[!![]+!![]]]+
([]+{})[~[]+(+!![]<<!![]+!![]+!![])]+
([]+[][{}])[-~[]]+
([]+{})[-~[]<<[-~[]+-~[]]]+
([][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})
[-~[]]+([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])
[+![]]+([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+
(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]][([]+{})[-~[]+(!![]<<!![]+!![])]+([]+{})[-~[]]+
([]+[][{}])[-~[]]+([]+!{})[!![]+!![]+!![]]+([]+!![])[+![]]+
([]+!![])[+!![]]+([]+!![])[-[~[]+~[]]]+([]+{})[-~[]+
(!![]<<!![]+!![])]+([]+!![])[+![]]+([]+{})[-~[]]+([]+!![])
[+!![]]](([]+!![])[+!![]]+([]+{})[-~[]<<[-~[]+-~[]]]+
([]+!![])[-[]]+([]+[][{}])[-[]]+([]+!![])[+!![]]+([]+[][{}])
[-~[]]+([]+{})[~[]+(+!![]<<!![]+!![]+!![])]+([]+![])
[!![]+!![]+!![]]+([]+![])[!![]<<!![]+!![]]+([]+![])
[!![]+!![]]+([]+![])[-[]])()+[])[([]+![])[!![]+!![]+
!![]]+([]+![])[!![]+!![]]+([]+[][{}])[!![]+(!![]<<!![]+!![])]+
([]+{})[!![]+(!![]<<!![]+!![])]+([]+!![])[!![]+!![]+!![]]](~[]+~[])[-[]]+
([]+{})[~[]+(+!![]<<!![]+!![]+!![])]+
(~[]/[]+[])[-~[]<<-(~[]+~[]+~[])]+
([~[]<[]]+[])[-[~[]+~[]+~[]]]+
([{}-{}]+[])[-~[]]+
([]+!![])[+!![]]+
(/!/+[])[-~[]])Это Женя Степанищев написал здесь такое вот поздравление. Как-то раз я уже описывал, как работает данный «обфускатор», почему-то не могу найти, повторюсь :)
Пока я искал, все появилось в комментариях :)
Теперь немного о том как это сделано.Здесь он продолжил:
Проще всего получить буквы I, N, O, a, b, c, d, e, f, i, j, l, n, o, r, s, t, u, y. Они встречаются в различных словах самого языка. Например, нам нужна буква «f». Нет ничего проще, берём значение «false», вырезаем первую букву: «false»[0].
Перевести что угодно в строку можно прибавляя слева пустой массив, напимер «[]+![]» будет «false». Получить нулевой символ тоже легко, нужно перевести массив в число. Получается: «([]+![])[+[]]». Можно получать менее очевидные вещи: «[]+{}» будет «[object Object]», «{}-{}» — NaN, а «~[]/[]» — «-Infinity».
С некоторыми другими буквами пришлось повозиться. Например, над «w» я долго ломал голову, наконец решил попробовать получить глобальный «window», преобразовать в строку и взять букву из него.А тут закончил:
Очевидный способ через пустой call какого-нибудь метода отказался работать в Файрфоксе (строгий режим они что ли включили?), поэтому я добрался до него в два приёма.
Во-первых, сначала мне нужен был конструктор какого-нибудь метода, чтобы вызвать конструктор Function. Это я решил так: [].sort.constructor (sort — хорошее имя метода, все буквы просто достаются), точнее, вот так [][’sort’][’constructor’], буквы подставляются методом, описанным чуть выше.
Во-вторых, вызовом конструктора я создал функцию, которая вернула self: [].sort.constructor(’return self’)()
Дальше — дело техники. Я отрезал последние две буквы (в зависимости от браузера я могу получить объект «window» или «DOMWindow», первая буква не годится) и взял первую: [][’sort’][’constructor’](’return self’)()[’slice’](-2)[0]
Кстати, «alert» вызывается аналогичным образом — надо добраться до window и вызвать у него «alert»: window[’alert’](’параметры’). Собственно, то же с любой другой глобальной функцией. Я, например, использую ещё atob, чтобы получить букву «h» в слове «happy». Вызов window[’atob’](’aA’) даст искомую букву.И добавил
Букву «a» для параметра «atob» получить просто, можно, например, отрезать её от «false», а большой «A» сложнее. Я поступил следующим образом: преобразовал конструктор массива к строке: «[]+[].constructor». Получается следующее:
function Array() {
[native code]
}
Искомая буква там — под номером девять (если считать с нуля), я девятку получил вот так: +([-~[]]+-![])+~[] (в строковом представлении сложил один и ноль, преобразовал число, прибавил минус один).
В итоге, буква «h» получается как-то так: [].sort.constructor(’return self’)()[’atob’](«false»[1] + ([]+[].constructor)[9])
О! Надо ещё про букву «p» рассказать. Я получил её из объекта «RegExp», знакомым уже способом: «([]+/!/.constructor)[14]».FIN

