Аргерих Л. О языке РНР. Часть 5. Страница 50


Конечно, такая проблема возникает только тогда, когда надо изменить язык объекта после его создания. Если приложению не требуется делать это, следу­ет установить наследование различных объектов вывода базовому объекту.

Уточнение сценария

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

Обычно с помощью 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. Запуская такой код, следует прояв­лять крайнюю осторожность, чтобы не выполнить строки, поступившие от пользователей, поскольку это будет серьезным нарушением правил безопас­ности.

Положиться на РНР в проверке символов на совпадение нельзя, поэтому по­пробуем с помощью РНР отыскать несовпадающие символы, которые для нас нежелательны. В нашем примере требуется удалить пустое пространст­во. В этом случае вместо поиска символов в словах можно получить жела­тельный результат, отыскивая символы, которые пробелами не являются. Соответствующее регулярное выражение будет выглядеть так: