RU EN

Использование Git tag

 

Добавление тега:

git tag -a -m "Первая версия проекта" v.0.0

Добавление тега к предыдущему коммиту:

git tag -m "Первая версия проекта" v.0.0 bfd9e47

Добавление тега в репозиторий:

git push --tags

Просмотре тега:

git show v.0.0
git describe --tags

Просмотр всех тегов проекта:

git tag -l
Комментариев: 0
01.01.2012 23:14


Как вырезать <br> в <pre> блоке TinyMCE

 

Озадачился проблемой вырезания тегов <br> в <pre> форматированном тексте TinyMCE. Вначале возник вариант:

<?php
    preg_replace('/<pre.*(<br[^>]*>).*<//pre>/i', '\n', $var);
?>

Но данный пример вырежет единственный тег в блоке, да и не хотелось делать это на стороне сервера. Значит, нужно придумать JavaScript-обработку. Решение получилось не совсем элегантным, но работает с неограниченным кол-вом блоков <pre> и <br>-тегов в них:

var tmp = getElementById('text');
var tmp = tmp.value.split(<br />);
var l = tmp.length;
var txt = '';

if (l > 1) {
    for (i = 0; i < l; i++) {
        // Если в подстроке есть тег <pre>, вырезаем все <br>
        if (tmp[i].indexOf('<pre') >= 0) {
            // Добавляем строку с открывающим тегом <pre>
            txt += (i > 0) ? '<br>' + tmp[i] : tmp[i];
            i++;
            // Следующего эл-та массива может и не быть
            if (typeof tmp[i] != 'undefined') {
                // Если в следующей подстроке тег не закрывается - добавляем "\r\n"
                while (tmp[i].indexOf('</pre>') < 0) {
                    txt += "\r\n" + tmp[i];
                    i++;
                }
                // Добавляем строку с закрывающим тегом <pre>
                txt += "\r\n" + tmp[i];
            }
        }
        else
            // Первой подстроке не добавляем <br>
            txt += (i > 0) ? '<br>' + tmp[i] : tmp[i];
    }
}
else
    txt = tmp[0];
Комментариев: 0
18.12.2011 18:58


Регулярные выражения в PHP

 

Кратко:

^      Начало регулярного выражения
$      Конец регулярного выражения
\A     Начало строки
\z     Конец строки
.      Один любой символ
\s     Один пустой символ (пробел, таб, символ перевода строки)
\S     Любой непустой символ
\d     Любая цифра
\D     Любая не цифра
\w     Любая буква и нижнее подчёркивание
\W     Не буква и не нижнее подчёркивание
\b     Граница слова (\bHello\b - совпадение с 'Hello')
(...)  Подвыражение (Subpattern)
(a|b)  a или b
?      Ноль или одно повторение чего-либо
*      Ноль и более
+      Один и более
{3}    3 повторения
{3,}   3 и более повторения
{3,6}  3-6 повторений

Ограничители (Delimiters)

При использовании PCRE (Perl Compatible Regular Expressions) в функциях, необходимо чтобы выражение было заключено в ограничители. Ими могут быть любые небуквенно-цифровые символы, не обратные слэши и не пустые символы (whitespace). Наиболее часто в качестве ограничителей используют прямой слэш '/', знак хэша '#' или тильду '~'. Например:

/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%

Если необходимо использовать символ ограничителя в выражении, он должен быть экранирован обратным слэшем:

'/http:\/\//'
'#http://#'

Функция preg_quote() может быть использована чтобы экранировать строку для внедрения её в выражение. Можно использовать второй необязательный параметр для экранирования конкретного символа:

<?php
$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // returns \$40 for a g3\/400
?>

После ограничителей можно использовать модификаторы выражения. Например, данный модификатор укажет, что данное выражение регистронезависимое:

/[a-z]/i

PCRE спецсимволы:

Любые из этих символов при использовании в регулярных выражениях в шаблонах соответствия, должны быть экранированы:

\ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Подмаски (Subpatterns):

Подмаски заключаются в круглые скобки и могут быть вложенными. Выделение части выражения в качестве подмаски делает 2 вещи:

  1. Определяет набор альтернатив. Например, подмаска cat(aract|erpillar|) соответствует одному из слов "cat", "cataract" и "caterpillar". Без заключения в скобки она бы соответствовала словам "cataract", "erpillar" или пустой строке.

  2. Подмаска становится захватываемым и возвращается в качестве соответствующего аргумента в PCRE функциях. Нумеруются захватываемые подмаски слева направо начиная с 1.

Например, строка "the red king", сопоставляемая подмаске ((red|white) (king|queen)), вернёт в качестве аргументов слова "red king", "red" и "king", которые будут пронумерованы 1, 2 и 3 соответственно.

Когда от подмаски не требуется функционала захвата подстрок, после открывающей круглой скобки ставится символ "?:". Такая подмаски исключается из нумерации захватываемых подмасок. Например, если строка "the white queen" сопоставляется с подмаской the ((?:red|white) (king|queen)), возвращаемые захваченные подстроки будут "white queen" и "queen" и будут пронумерованы 1 и 2 соответственно. Максимальное количество захватываемых подмасок в выражении - 99. Максимальное кол-во всех подмасок (захватываемых и нет) - 200.

Между знаками "?" и ":" в не захватываемой подмаске можно использовать дополнительные опции. Следующие два шаблона:

(?i:saturday|sunday)
(?:(?i)saturday|sunday)

соответствуют одинаковому набору строк. Так как альтернативы обрабатываются слева направо и опции действуют до конца подмаски, опция, установленная в первой части влияет на последующие. Поэтому приведённые выше шаблоны соответствуют как "SUNDAY", так и "Saturday".

Также можно использовать именованные подмаски с помощью синтаксиса (?P<name>pattern). Эта подмаска будет индексирована в массиве совпадений кроме обычного числового индекса, еще и по имени name. В PHP 5.2.2 было добавлено два альтернативных синтаксиса: (?<name>pattern) и (?'name'pattern).

Иногда бывает необходимо иметь несколько совпадений, исключающих друг друга. Обычно, каждое такое совпадение получает свой собственный номер, даже если шаблон позволяет совпасть только одному из них. Синтаксис (?| позволяет обойти это поведение и убрать дублирующиеся номера. Рассмотрим следующее регулярное выражение, сопоставленное со строкой Sunday:

(?:(Sat)ur|(Sun))day

Здесь Sun сохраняется в ссылке 2, тогда как ссылка 1 пуста. Если же совпадет Sat, то она будет помещена в ссылку 1, а ссылка 2 вообще не будет существовать. Использование (?| в шаблоне решает эту проблему:

(?|(Sat)ur|(Sun))day

В этом шаблоне обе подмаски Sun и Sat будут сохранены под номером 1.

Оригинальная документация.

Комментариев: 0
16.12.2011 05:48


Алиасы (alias) в Debian

 

Алиасы могут значительно упростить суровую жизнь пользователя Linux. Часто используемым трудно запоминаемым длинным команда можно назначить короткий алиас. Открываем файл .bashrc и добавляем следующее:

alias ll='ls -hlAX --file-type --group-directories-first'

Теперь набрав в консоли команду ll можно получить список файлов директории отсортированных по типу, с удобочитаемым размером и т.д. Вот ещё пара алиасов, которые мне пригодились:

alias la='ls -hAv --group-directories-first'
alias l='ls -CF'
alias webon='sudo mysql.server start && sudo /usr/local/php/sbin/php-fpm && sudo /usr/local/nginx/sbin/nginx'
alias weboff='sudo /usr/local/nginx/sbin/nginx -s stop && sudo kill `cat /usr/local/php/var/run/php-fpm.pid` && sudo mysql.server stop'
alias phpcs='phpcs --standard=Veles --encoding=utf-8'
alias webupd='rsync --partial --partial-dir=/home/user/.rsync-partial --delay-updates --exclude=.git --exclude=.gitignore ---delete --delete-excluded -pavr -e "ssh -p35667" /home/user/Progects/progect/www/ user@192.168.1.200:/home/user/progect/www/'
alias mysqllocal='mysql -uroot --auto-vertical-output'
Комментариев: 0
12.12.2011 21:23


Сброс root пароля в MySQL

 

Останавливаем MySQL

service mysql stop
# или так:
mysqladmin -uroot shutdown
# или можно так:
ps aux | grep mysql # эта команда выведет pid mysqld процесса
kill <pid>
# еще можно так:
kill `cat /var/run/mysql/mysql.pid` # путь к pid-файлу процесса может быть другой!
# по-умолчанию pid-файл создаётся в <basedir>/data

Запускаем MySQL и меняем пароль

mysqld_safe --skip-grant-tables --user=root &
-- далее запрос на смену пароля
UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root';
-- Выходим из MySQL
exit

Перезагружаем MySQL

service mysql restart

Иногда, при обновлении, mysql пользователю root@localhost по-умолчанию выставляется тип авторизации auth_socket и после этого невозможно залогиниться. Чтобы исправить, надо загрузить mysql способом описанным выше и выполнить запрос:

UPDATE mysql.user
SET plugin = 'mysql_native_password'
WHERE User = 'root';

 

Комментариев: 0
12.12.2011 09:51