Конечно, такая проблема возникает только тогда, когда надо изменить язык объекта после его создания. Если приложению не требуется делать это, следует установить наследование различных объектов вывода базовому объекту.
Уточнение сценария
Переведя выводимые данные на другой язык, можно продвинуться дальше и сделать работу сценария более тонкой. Надо определить, в каком формате пользователю показывается время и, что далеко не последнее по важности, каким образом РНР осуществляет сортировку.
Обычно с помощью set locale () различным функциям РНР сообщается о том, с каким языком мы работаем. Функции, зависящие от локали, выбирают текущую локаль и пользуются ею, как могут, но остальные функции продолжают работу, не замечая локали. О setlocale() будет рассказано далее в этой главе.
Регулярные выражения
В РНР регулярные выражения не используют Например, попробу
ем выделить в строке три слова, разделенные пробелами:
{string = 'Just three words';
ereg('([a-zA-Z]+) ([a-zA-Z]+) ([a-zA-Z]+)', {string, $regs);
Этот код поместит три слова в первые три позиции $regs (фактически они займут позиции 1-3, т. к. слот 0 содержит копию $st ring). Поскольку мы задали диапазоны явно, они не охватывают специальные символы из других языков.
Можно также использовать классы символов ainum следующим образом:
<?php
$string, Sregs);
К несчастью, этот вариант все равно не работает со специальными символами, хотя он должен учитывать локаль. Если попробовать сделать то же самое с помощью утилиты UNIX g rep, то обнаружится, что она корректно обрабатывает специальные символы, если локаль установлена правильно:
echo -e ' a\nb\nc\nae\n0\nS' grep ' [[:alnum: ]]'
а b с
export LC_ALL=da_DK
echo -e ' a\n'o\nc\пав\п0\па' grep ' [ f: alnum ■ ]]' a b с ее 0 a
При действительной необходимости найти специальные символы, основываясь на можно включить g rep в сценарий РНР следующим образом:
exec("echo("input") | grep 'pattern'", $output)
Этот код выполняет командную строку, заданную в первом аргументе, и сохраняет результат в массиве $output. Запуская такой код, следует проявлять крайнюю осторожность, чтобы не выполнить строки, поступившие от пользователей, поскольку это будет серьезным нарушением правил безопасности.
Положиться на РНР в проверке символов на совпадение нельзя, поэтому попробуем с помощью РНР отыскать несовпадающие символы, которые для нас нежелательны. В нашем примере требуется удалить пустое пространство. В этом случае вместо поиска символов в словах можно получить желательный результат, отыскивая символы, которые пробелами не являются. Соответствующее регулярное выражение будет выглядеть так: