Пишу, по большей части, про историю, свою жизнь и немного про программирование.

PHP, UTF-8: седьмой этап, давайте что-нибудь сделаем с регулярными выражениями

В прошлый раз я рассматривал, по сути, самый сложный этап — замену всех вхождений $var[$index] и им подобных на вызов моей функции. В процессе замены я несколько раз корректировал заметку и доводил некоторые вещи руками.

Осталось совсем немного, но я столкнулся с неприятной проблемой.

В самой первой части я рассказывал о том как можно решить проблему с UTF-8 в регулярных выражениях — нужно поставить «глагол» (в терминах PCRE) UCP и добавить модификатор «u». Тогда в PCRE начинают адекватно, по отношению к UTF-8, работать «\w», «\W», «\s», «\S» и т. п.

К сожалению, этот «глагол» появился только в PCRE 8.10, а в самом последнем PHP, на сегодняшний момент, содержится 8.02. Как я говорил ранее, новый PCRE можно вкомпилить в PHP при помощи специального ключа.

Внутренние сервисы, где я работаю, используют Debian-системы и Debian-пакеты, все наши проекты выкладываются через эти пакеты. Чтобы поставить нестандартный PHP+PCRE, нужно собрать три пакета (php-cgi, php-cli и модуль к Apache).

Поскольку мы сейчас переходим постепенно на новую версию Ubuntu (с Hardy Heron на Lucid Lynx), то часть машин у нас пока на Цапле, а часть — уже на Рыси. Это значит, что пакетов нужно будет собрать шесть.

Дело это непростое. Я решил попробовать «выдрать» из внутренностей PHP модуль PCRE, переименовать его функции и константы и поставить его как простой подключаемый модуль.

Мне удалось сделать, модуль «свежего PCRE» (можно скачать в разделе «Храню»). Модуль называется ygx, все функции начинаются с префикса «ygx_», константы — с «YGX_».

Что это за сокращение, не спрашивайте, когда я начинал работать, я это знал, а сейчас забыл.

Сложнее всего было корректно переименовать только те функции, типы, константы и так далее, которые видно в PHP, не задев всё то, что импортируется из внешней библиотеки PCRE.

Ставится модуль примерно следующим образом:

mkdir /tmp/pcre
cd !:1
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.10.tar.bz2
tar xvfj pcre-8.10.tar.bz2
cd pcre-8.10
./configure --prefix=/usr/local/pcre-8.10 --enable-utf8 --enable-unicode-properties --disable-static
make && make install
cd -

wget /files/php_fresh_pcre.zip
unzip php_fresh_pcre.zip
phpize
./configure --with-ygx-regex=/usr/local/pcre-8.10
make && sudo make install
phpize --clean
cd ; rm -rf /tmp/pcre

потом нужно прописать в php.ini строку «extension=ygx.so», перезапустить на FastCGI-сервер или веб-сервер с модулем PHP (смотря чем вы пользуетесь) и, вуаля, у вас есть новые функции — ygx_relace, ygx_match и т. д.

Поскольку к этому моменту все вызовы функций PCRE у меня заменены на вызовы одноимённых методов статического класса UTF, то мне нужно поменять «preg_» на «ygx_» только в одном месте — внутри методов этого класса.

3 комментария
Тима Люмин 2010

Просьба.
Посоветуй что-нибудь, что можно почитать о php для повышения уровня.
Какие-нибудь хорошие авторы?

Евгений Степанищев (bolknote.ru) 2010

Комментарий для Тима Люмин:

Можно поступить как я — прочитать мануал.

nudnik.ru 2010

Комментарий для Евгения Степанищева:

Зачем ты травишь человека! Не все мануал могут осилить.
Советую гуглить «PHP 5 в подлиннике Котеров Дмитрий скачать бесплатно пожалуйста».

Там тот же мануал, но в хорошем пересказе для простых парней.