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 комментария

Как там штанга?

Что-то у меня давно постов про спорт не было.

После последнего серьёзного отравления резко ухудшилось здоровье, я потерял в весе около 5 кг, ухудшилась выносливость. В последнее время на спортивном поприще я был занят только тем, что выравнивал результат на состояние до отравления.

Сейчас уже более-менее похоже на то, что было. Сегодня попробовал поднять 98 кг, поднял два раза, уже неплохо. Буду улучшать.

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

Что за проект я перевожу на UTF: FAQ

Wiki на UTF-8 (55.74КиБ)

Из комментариев на одном из сайтов Димы видно, что люди делают какие-то совершенно дикие выводы относительно моей эпической борьбы с UTF-8 в PHP. Кстати, она окончена, остались мелочи, доделки и доводки. На скриншоте — уже бета.

Так что небольшое FAQ.

В: Долго ещё до конца сериала? О: Следующая часть будет последней.

B: Что за проект переводится на UTF-8? О: Это внутренняя Вики, основанная на ВаккоВики, дописанная за годы использования и интегрированная с остальными внутренними сервисами. Её нередко можно встретить на слайдах презентаций «Яндекса».

B: Зачем переводится? О: Все остальные внутренние сервисы «Яндекса» на UTF-8, что делает задачу интеграции Вики иногда чрезвычайно сложной, кроме того, есть большая потребность научить нашу Вики работать не только с русскими и английским, но и с другими языками.

B: Нельзя ли переписать это всё на другой язык, где нет проблем с UTF-8? О: Можно, но это человеко-годы, я справился намного быстрее.

В: Зачем нужно было всё автоматизировать? О: Во-первых, автоматизированно было далеко не всё, некоторые места я искал в автоматическом режиме, а изменения приходилось вносить руками, во-вторых, всего было сделано несколько тысяч замен, можно ли такое количество заменить вручную, да ещё и не ошибиться?

В: Почему бы нанять сотню студентов, за копейки, чтобы они сделали замены руками? О: За этими студентами нужно проверять работу, кто это будет делать? Я за собой вычитывал исходники, распечатывал листы diff’ов, уходил куда-нибудь в переговорку и работал с бумажками — выделял карандашом проблемные места, потом новая итерация. Со скриптом проще — в одинаковых ситуациях он споткнётся одинаково, сотня студентов споткнётся сотней разных способов.

21 комментарий

День рождения сайта

Сегодня, кстати, моему сайту исполняется 10 лет. Я планировал к этому сроку выложить старые материалы, сменить дизайн, но ничего не успел, задача перевода Вики на UTF-8 съела всё моё время, я даже дома размышлял над этой задачей и делал разнообразные тесты.

Буду делать потихоньку.

10 комментариев