Отсутствие reg comp php. Man regcomp (3): функции регулярных выражений POSIX. имя = тип значение

Для начала мы усовершенствуем страничку регистрации, добавив возможность загружать аватар. Исходное изображение должно быть формата jpg, gif или png. Так же оно должно быть не более 2 Мб. Не беспокойтесь, после его сжатия скриптом, размер аватара будет около 3 кб и формат jpg. Откройте страницу reg. php и допишите в теге < form > строчку enctype="multipart/form-data" ,как в примере:


Регистрация










Теперь сохраняем reg.php

2.Затем необходимо создать еще одно поле в таблице users . Заходим в phpmyadmin , выбираем нужную базу и таблицу.


Выставляем все значения, как на рисунке:

В это поле будет записываться путь до аватара, а сам он сохраняется в отдельную папку, назовем ее «avatars». Папка будет расположена в том же каталоге, что и остальные файлы скрипта.

3.Переходим к файлу save _ user . php и дописываем следующий код после удаления пробелов у логина и пароля:

//удаляем лишние пробелы
$login = trim($login);

// дописываем новое********************************************

//добавляем проверку на длину логина и пароля
if (strlen($login) < 3 or strlen($login) > 15) {
exit ("Логин должен состоять не менее чем из 3 символов и не более чем из 15.");
}
if (strlen($password) < 3 or strlen($password) > 15) {
exit ("Пароль должен состоять не менее чем из 3 символов и не более чем из 15.");
}

if (!empty($_POST["fupload"])) //проверяем, отправил ли пользователь изображение
{
$fupload=$_POST["fupload"]; $fupload = trim($fupload);
if ($fupload =="" or empty($fupload)) {
unset($fupload);// если переменная $fupload пуста, то удаляем ее
}
}
if (!isset($fupload) or empty($fupload) or $fupload =="")
{
//если переменной не существует (пользователь не отправил изображение),то присваиваем ему заранее приготовленную картинку с надписью "нет аватара"
$avatar = "avatars/net-avatara.jpg"; //можете нарисовать net-avatara.jpg или взять в исходниках
}
else
{
//иначе - загружаем изображение пользователя
$path_to_90_directory = "avatars/";//папка, куда будет загружаться начальная картинка и ее сжатая копия

If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"]))//проверка формата исходного изображения
{
$filename = $_FILES["fupload"]["name"];
$source = $_FILES["fupload"]["tmp_name"];
$target = $path_to_90_directory . $filename;
move_uploaded_file($source, $target);//загрузка оригинала в папку $path_to_90_directory
if(preg_match("/[.](GIF)|(gif)$/", $filename)) {
$im = imagecreatefromgif($path_to_90_directory.$filename) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
if(preg_match("/[.](PNG)|(png)$/", $filename)) {
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}

If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) {
$im = imagecreatefromjpeg($path_to_90_directory.$filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
}
//СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ И ЕГО ПОСЛЕДУЮЩЕЕ СЖАТИЕ ВЗЯТО С САЙТА www.codenet.ru
// Создание квадрата 90x90
// dest - результирующее изображение
// w - ширина изображения
// ratio - коэффициент пропорциональности
$w = 90; // квадратная 90x90. Можно поставить и другой размер.
// создаём исходное изображение на основе
// исходного файла и определяем его размеры
$w_src = imagesx($im); //вычисляем ширину
$h_src = imagesy($im); //вычисляем высоту изображения
// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$w);
// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// вырезаем квадратную верхушку по y,
// если фото вертикальное (хотя можно тоже серединку)
if ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// квадратная картинка масштабируется без вырезок
if ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$date=time(); //вычисляем время в настоящий момент.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");//сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен.
//почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. Не очень приятно читать его комментарий, когда краем глаза замечаешь какое-то движение.
$avatar = $path_to_90_directory.$date.".jpg";//заносим в переменную путь до аватара.
$delfull = $path_to_90_directory.$filename;
unlink ($delfull);//удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было - получить миниатюру.
}
else
{
//в случае несоответствия формата, выдаем соответствующее сообщение
exit ("Аватар должен быть в формате JPG,GIF или PNG");
}
//конец процесса загрузки и присвоения переменной $avatar адреса загруженной авы
}



// дописали новое********************************************
// Далее идет все из первой части статьи,но необходимо дописать изменение в запрос к базе.
//подключаемся к базе
// проверка на существование пользователя с таким же логином
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) {
exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");
}
// если такого нет, то сохраняем данные
$result2 = mysql_query ("INSERT INTO users (login,password,avatar) VALUES("$login","$password","$avatar")");
// Проверяем, есть ли ошибки
if ($result2=="TRUE")
{
echo "Вы успешно зарегистрированы! Теперь вы можете зайти на сайт. Главная страница";
}
else {
echo "Ошибка! Вы не зарегистрированы.";
}
?>

4. Необходимо добавить одну таблицу в ту же базу. В ней будут хранится ip-адреса, которые допустили ошибки при входе. Таким образом мы сможем ограничить доступ тем, кто ошибся больше трёх раз подряд на минут 15. Думаю программам, подбирающим пароли, долго придется возиться.
Зайдем в phpmyadmin и создадим новую таблицу с 3-мя полями:


ip - ip-адрес.
date - дата неудачного входа за последние 15 минут у пользователя с данным ip. col - количество ошибок за последние 15 минут у пользователя с данным ip.
Отлично! Готово, теперь изменим файл проверки логина и пароля, ведь теперь у нас пароль зашифрован. Открываем testreg.php и удаляем все, что дальше удаления пробелов с логина и пароля. Далее добавляем следующий код:

//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);

// заменяем новым********************************************
// подключаемся к базе
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
// минипроверка на подбор паролей
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=="unknown") { $ip=getenv("REMOTE_ADDR"); }//извлекаем ip
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//удаляем ip-адреса ошибавшихся при входе пользователей через 15 минут.
$result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);// извлекаем из базы количество неудачных попыток входа за последние 15 у пользователя с данным ip
$myrow = mysql_fetch_array($result);
if ($myrow["col"] > 2) {
//если ошибок больше двух, т.е три, то выдаем сообщение.
exit("Вы набрали логин или пароль неверно 3 раз. Подождите 15 минут до следующей попытки.");
}
$password = md5($password);//шифруем пароль
$password = strrev($password);// для надежности добавим реверс
$password = $password."b3p6f";
//можно добавить несколько своих символов по вкусу, например, вписав "b3p6f". Если этот пароль будут взламывать методом подбора у себя на сервере этой же md5,то явно ничего хорошего не выйдет. Но советую ставить другие символы, можно в начале строки или в середине.
//При этом необходимо увеличить длину поля password в базе. Зашифрованный пароль может получится гораздо большего размера.

$result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //извлекаем из базы все данные о пользователе с введенным логином и паролем
$myrow = mysql_fetch_array($result);
if (empty($myrow["id"]))
{
//если пользователя с введенным логином и паролем не существует
//Делаем запись о том, что данный ip не смог войти.
$select = mysql_query ("SELECT ip FROM oshibka WHERE ip="$ip"");
$tmp = mysql_fetch_row ($select);
if ($ip == $tmp) {//проверяем, есть ли пользователь в таблице "oshibka"
$result52 = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52 + 1;//прибавляем еще одну попытку неудачного входа
mysql_query ("UPDATE oshibka SET col=$col,date=NOW() WHERE ip="$ip"");
}
else {
mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ("$ip",NOW(),"1")");
//если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "oshibka"
}

exit ("Извините, введённый вами логин или пароль неверный.");
}
else {
nbsp; //если пароли совпадают, то запускаем пользователю сессию! Можете его поздравить, он вошел!
$_SESSION["password"]=$myrow["password"];
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//эти данные очень часто используются, вот их и будет "носить с собой" вошедший пользователь

//Далее мы запоминаем данные в куки, для последующего входа.
//ВНИМАНИЕ!!! ДЕЛАЙТЕ ЭТО НА ВАШЕ УСМОТРЕНИЕ, ТАК КАК ДАННЫЕ ХРАНЯТСЯ В КУКАХ БЕЗ ШИФРОВКИ
if ($_POST["save"] == 1) {
//Если пользователь хочет, чтобы его данные сохранились для последующего входа, то сохраняем в куках его браузера
setcookie("login", $_POST["login"], time()+9999999);
setcookie("password", $_POST["password"], time()+9999999);
}}
echo "";//перенаправляем пользователя на главную страничку, там ему и сообщим об удачном входе
?>

5. Полностью изменим главную страничку. Необходимо на ней вывести аватар пользователя, вывести ссылку на выход из аккаунта и добавить чекбокс для запоминания пароля при входе.
Index.php

// вся процедура работает на сессиях. Именно в ней хранятся данные пользователя, пока он находится на сайте. Очень важно запустить их в самом начале странички!!!
session_start();
include ("bd.php");// файл bd.php должен быть в той же папке, что и все остальные, если это не так, то просто измените путь
if (!empty($_SESSION["login"]) and !empty($_SESSION["password"]))
{
//если существует логин и пароль в сессиях, то проверяем их и извлекаем аватар
$login = $_SESSION["login"];
$password = $_SESSION["password"];
$result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
$myrow = mysql_fetch_array($result);
//извлекаем нужные данные о пользователе
}
?>


Главная страница


Главная страница

if (!isset($myrow["avatar"]) or $myrow["avatar"]=="") {
//проверяем, не извлечены ли данные пользователя из базы. Если нет, то он не вошел, либо пароль в сессии неверный. Выводим окно для входа. Но мы не будем его выводить для вошедших, им оно уже не нужно.
print <<


HERE;

If (isset($_COOKIE["login"])) //есть ли переменная с логином в COOKIE. Должна быть, если пользователь при предыдущем входе нажал на чекбокс "Запомнить меня"
{
//если да, то вставляем в форму ее значение. При этом пользователю отображается, что его логин уже вписан в нужную графу
echo " value="".$_COOKIE["login"]."">";
}

print <<




HERE;

If (isset($_COOKIE["password"]))//есть ли переменная с паролем в COOKIE. Должна быть, если пользователь при предыдущем входе нажал на чекбокс "Запомнить меня"
{
//если да, то вставляем в форму ее значение. При этом пользователю отображается, что его пароль уже вписан в нужную графу
echo " value="".$_COOKIE["password"]."">";
}

Print <<



Запомнить меня.






Зарегистрироваться



Вы вошли на сайт, как гость

HERE;
}
else
{
//при удачном входе пользователю выдается все, что расположено ниже между звездочками.

print <<
Вы вошли на сайт, как $_SESSION (выход)


Эта ссылка доступна только зарегистрированным пользователям

Ваш аватар:




HERE;

//************************************************************************************
//при удачном входе пользователю выдается все, что расположено ВЫШЕ между звездочками.
}
?>

6. Необходимо сделать возможность выйти из аккаунта пользователям, которые вошли. На главной странице уже была ссылка на выход. Но этого файла пока не существует. Так создадим новый файл exit.php с кодом:

session_start();
if (empty($_SESSION["login"]) or empty($_SESSION["password"]))
{
//если не существует сессии с логином и паролем, значит на этот файл попал невошедший пользователь. Ему тут не место. Выдаем сообщение об ошибке, останавливаем скрипт
exit ("Доступ на эту страницу разрешен только зарегистрированным пользователям. Если вы зарегистрированы, то войдите на сайт под своим логином и паролем
Главная страница");
}

unset($_SESSION["password"]);
unset($_SESSION["login"]);
unset($_SESSION["id"]);// уничтожаем переменные в сессиях
exit("");
// отправляем пользователя на главную страницу.
?>

Ну вот и все! Пользуйтесь на здоровье! Удачи!

Утилита REGINI.EXE первоначально входила в состав пакета Resource Kit, но, начиная с Windows XP, является стандартным компонентом системного программного обеспечения. Используется в сценариях администрирования для управления доступом к разделам (ключам) реестра на локальном или удаленном компьютере.

Формат командной строки:

REGINI [-m \\machinename | -h hivefile hiveroot] [-i n] [-o outputWidth][-b] textFiles...

Параметры командной строки:

-m \\machinename - имя или адрес удаленного компьютера, на котором будет выполняться изменение разрешений для разделов реестра.

-h - определяет куст реестра на локальном компьютере, для которого будут устанавливаться разрешения.

-i n – смещение текста от первой позиции строки. По умолчанию равно 4

-o outputWidth - максимальный размер строк вывода. По умолчанию соответствует ширине консоли.

-b - определяет режим обратной совместимости с предыдущими версиями REGINI (backward compatible).

textFiles - имена текстовых файлов в кодировке ANSI или Unicode, представляющих собой сценарии для изменения разрешений реестра.

Примеры использования:

regini /? - отобразить краткую справку по использованию команды.

regini acl1reg.txt - выполнить изменения разрешений для разделов (ключей) реестра на локальном компьютере с использованием файла сценариев acl1reg.txt

regini –m \\COMP0 C:\scripts\acl2reg.txt - выполнить изменения разрешений для реестра на удаленном компьютере COMP0 с использованием сценария C:\scripts\acl2reg.txt

Сценарии для утилиты REGINI содержат специальные директивы и параметры, с помощью которых можно управлять доступом к разделам (ключам) реестра Windows. Файлы сценариев представляют собой обычные текстовые файлы, которые можно редактировать, например, с помощью редактора ”Блокнот” (Notepad). Строки сценариев содержат адреса разделов и числовые коды, разделенные пробелами и определяющие разрешения в формате:

(путь к разделу реестра) [разрешения]

Например, строка сценария, устанавливающая разрешения доступа для раздела Adm :

HKEY_LOCAL_MACHINE\Software\Adm

В данном примере, устанавливаются разрешения , расшифровать которые можно с использованием следующей таблицы:

1 - Администратор, полный доступ

2 - Администратор, чтение

3 - Администратор, чтение и запись

4 - Администратор, чтение, запись и удаление

5 - Создатель, полный доступ

6 - Создатель, чтение и запись

7 - Все, полный доступ

8 - Все, чтение

9 - Все, чтение и запись

10 - Все, чтение, запись и удаление

11 - Опытные пользователи, полный доступ

12 - Опытные пользователи, чтение и запись

13 - Опытные пользователи, чтение, запись и удаление

14 - Системный оператор, полный доступ

15 - Системный оператор, чтение и запись

16 - Системный оператор, чтение, запись и удаление

17 - Система, полный доступ

18 - Система, чтение и запись

19 - Система, чтение

20 - Администратор, чтение, особые разрешения

21 - Интерактивные пользователи, чтение, полный доступ

22 - Интерактивные пользователи, чтение

23 - Интерактивные пользователи, чтение, особые разрешения

0 - Нет групп или пользователей, имеющих разрешение на доступ к данному объекту, но владелец объекта может назначить разрешения.

Таким образом, код означает

Администратор, полный доступ
Создатель, полный доступ
Все, чтение и запись

Необходимо учитывать тот факт, что ранее установленные разрешения сбрасываются, и если, после комбинации в сценарии будет использована, например директива:

HKEY_LOCAL_MACHINE\Software\Adm

То это означает, не добавление кода 4 - Администратор, чтение, запись и удаление, к существующим кодам 1 5 9 , а их замена. Для добавления новых разрешений, с сохранением старых, строка должна быть следующего вида:

HKEY_LOCAL_MACHINE\Software\Adm

При добавлении новых ключей или параметров в реестр, в файле сценария первой строкой указывается имя ключа, а второй (последующими) строкой указывается имя параметра, знак равенства, тип данных и значение:

ИМЯ КЛЮЧА

Имя параметра = тип данных значение

Пример файла сценария:

HKEY_CURRENT_USER\TEST

Text=REG_SZ String1

Первая строка указывает имя ключа (подраздела реестра) HKEY_CURRENT_USER\TEST, в который будет записан параметр и в квадратных скобках – код разрешения доступа к нему. Если подраздел TEST не существует, то он будет создан с указанными разрешениями, если существует – то выполнится смена разрешений на указанные в квадратных скобках. Если код разрешений не задан, то разрешения не изменяются. Вторая строка указывает имя и значение параметра, который будет записан в данный ключ реестра. Если параметр text не существует, то он будет создан, если существует, то будет изменено его значение на строку String1 .

Наличие знака равенства = в строке сценария утилита regini.exe интерпретирует как команду на запись параметра в формате

имя = тип значение

Для удаления значения параметра, строка должна иметь вид:

Для удаления самого параметра, используется ключевое слово DELETE

text=DELETE

Под строкой с именем ключа можно располагать несколько команд на изменение или добавление параметров:

text=REG_SZ This is text


Value1=REG_DWORD 0x0A0D

Использование команды REGINI представляет собой определенную опасность, поэтому, прежде чем делать серьезные изменения в системе, рекомендуется выполнить резервное копирование и ознакомиться со способами восстановления Windows.

Если необходимо установить новые разрешения для куста реестра, принадлежащего другой операционной системе, то необходимо учитывать тот факт, что пути к разделам реестра должны указываться относительно имени куста, так например, для изменения разрешения для раздела HKEY_LOCAL_MACHINE\System на доступ команда должна иметь вид:

regini –h D:\oldwin\system32\config\system newacl.txt

А файл newacl.txt должен содержать строку без имени подраздела:

Для просмотра существующих разрешений в командной строке Windows NT/2000 можно использовать утилиту regdmp.exe из состава дополнительных инструментов Resource Kit. В составе более поздних версий ОС Windows, стандартных средств, для просмотра разрешений разделов реестра в командной строке, не имеется.

#include
#include
int regcomp(regex_t * preg , const char * regex , int cflags );
int regexec(const regex_t * preg , const char * string , size_t nmatch ,
regmatch_t pmatch , int eflags );
size_t regerror(int errcode , const regex_t * preg , char * errbuf ,
size_t errbuf_size );
void regfree(regex_t * preg );

ОПИСАНИЕ

Компилирование регулярных выражений POSIX

Функция regcomp () используется для компиляции регулярного выражения в формат, который подходит для последующих поисков с помощью regexec ().

regcomp () передаётся указатель на область хранения буферного шаблона preg , указатель на заканчивающуюся null строку regex и флаги cflags , используемые для определения типа компиляции.

Все поиски регулярных выражений должны выполняться с помощью скомпилированного буферного шаблона, поэтому regexec () должна всегда вызываться с адресом буферного шаблона, инициализированного функцией regcomp ().

Значение cflags может состоять из поразрядного or нуля или нескольких следующих значений:

REG_EXTENDED Использовать синтаксис расширенных регулярных выражений POSIX во время интерпретации regex . Если не включён этот флаг, то используется синтаксис простых регулярных выражений POSIX. REG_ICASE Не учитывать регистр. Последующие поиски regexec () с использованием данного буферного шаблона не будут зависеть от регистра. REG_NOSUB Не сообщать положение совпадений. Параметры nmatch и pmatch для regexec () игнорируются, если данный буферный шаблон был скомпилирован с этим включённым флагом. REG_NEWLINE Операторы совпадения с любым символом не совпадают с символом новой строки.

Список несовпадающих символов ([^...] ) без символа новой строки не совпадает с новой строкой.

Оператор сравнения по началу строки (^ ) совпадает с пустой строкой сразу после новой строки независимо от того, что eflags , флаги выполнения regexec (), содержат REG_NOTBOL .

Оператор сравнения по концу строки ($) совпадает с пустой строкой до символа начала строки независимо от того, что eflags содержит REG_NOTEOL .

Сравнение с регулярным выражением POSIX

Функция regexec () используется для сравнения строки, завершающейся null, с предварительно обработанным буферным шаблоном preg . Аргументы nmatch и pmatch используются для предоставления информации о местонахождении любых совпадений. Значение eflags может быть поразрядным ИЛИ одного или обоих значений REG_NOTBOL и REG_NOTEOL . Данные значения определяют поведение процесса сравнения так, как описано ниже. REG_NOTBOL Оператор сравнения по началу строки всегда завершается с ошибкой (но смотрите описанный выше флаг компиляции REG_NEWLINE ). Этот флаг может использоваться, когда в regexec () передаются отдельные части строки, и начало такой строки в данном случае не должно интерпретироваться как начало новой строки. REG_NOTEOL Оператор сравнения по концу строки всегда завершается с ошибкой (но смотрите описанный выше флаг компиляции REG_NEWLINE ).

Байтовые смещения

Если REG_NOSUB не установлен при компиляции буферного шаблона, то возможно получать информацию о положении совпадений. Значение pmatch должно быть определено так, чтобы иметь, по крайней мере, nmatch элементов. Они заполняются regexec () адресами внутристрочных совпадений. Смещения подвыражения, начинающегося с i -й открытой скобки, сохраняется в pmatch[i] . Адрес совпадения всего регулярного выражения сохраняется в pmatch (заметим, что чтобы вернуть смещения совпадений N подвыражений, значение nmatch должно быть не менее N+1 ). Любые неиспользованные элементы структуры будут содержать значение -1.

Структура regmatch_t , являющаяся типом pmatch , определена в :

Typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t;

Каждый элемент rm_so , не равный -1, показывает начальное смещение следующего совпадения наибольшей подстроки внутри заданной строки. Относительный элемент rm_eo указывает на смещение конца совпадения, которое является первым символом после совпавшего текста.

Сообщение об ошибках POSIX

Функция regerror используется для преобразования кодов ошибок, которые могут быть получены от regcomp () и regexec (), в строки сообщений об ошибках.

В regerror передаются: код ошибки errcode , буферный шаблон preg , указатель на символьный буфер строки errbuf и размер буфера строки errbuf_size . Функция возвращает размер errbuf , который требуется для сохранения сообщения об ошибке в виде строки, оканчивающейся null. Если и errbuf , и errbuf_size не равны нулю, то errbuf заполняется первыми errbuf_size - 1 символами сообщения об ошибке и завершается байтом null ("\0").

Освобождение буфера шаблона POSIX

Функция regfree () освобождает память, отведённую буферному шаблону preg во время процесса компиляции с помощью regcomp ().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция regcomp () возвращает ноль при успешной компиляции или в противном случае код ошибки.

Функция regexec () возвращает ноль при совпадении или REG_NOMATCH , если совпадений не было.

ОШИБКИ

Функция regcomp () может возвращать следующие ошибки: REG_BADBR Неправильное использование оператора обратных ссылок. REG_BADPAT Неправильное использование операторов шаблона, таких, как операторы группы или списка. REG_BADRPT Неправильное использование операторов повторения, например, использование «*» в качестве первого символа. REG_EBRACE Непарные скобки в операторах интервала. REG_EBRACK Непарные квадратные скобки в операторах списка. REG_ECOLLATE Неправильный элемент сортировки. REG_ECTYPE Неизвестное имя класса символов. REG_EEND Потенциальная ошибка. Не определена в POSIX.2. REG_EESCAPE Конечная обратная косая черта. REG_EPAREN Непарные круглые скобки в операторах группировки. REG_ERANGE Неправильное использование оператора области: например, конец области появляется прежде её начала. REG_ESIZE Скомпилированное регулярное выражение требует буферный шаблон размером, большим 64 Кб. Это не определено в POSIX.2. REG_ESPACE Для процедур регулярных выражений закончилась память. REG_ESUBREG Неправильная обратная ссылка на подвыражение.

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

Все виды данных, хранящихся в реестре: профили пользователей, тип файла ассоциации, информацию об оборудовании, серийные номера, и многое другое. С тех пор как доступна функция расширения win32std, ваши приложения Windows на основе PHP получат доступ к реестру.

Расширение Win32std может быть загружено в качестве предварительно скомпилированных библиотек из downloads.php.net/Pierre/ . Просто поместите его в свою PHP- Ext папку, обновить php.ini файл и перезапустить Apache, если необходимо. Отметим, что библиотеки которые вы загрузите являются 32-разрядными, так что если вы используете 64-разрядную сборку , вам придется, либо установить WampServer 32-разрядную сборку или попытаться скомпилировать библиотеку самостоятельно.

Реестр Layout

Реестр имеет репутацию темные, опасные и страшные места в операционной системе Windows. Это, вероятно, более преувеличенный страх, но все равно я повторю цитату Microsoft:

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

Реестр Windows разделен на 5 основных групп, известных как keys:

  1. HKEY_CURRENT_CONFIG — ключ хранит информацию о аппаратных средствах компьютера, таких как разрешение монитора и настройки динамиков. Можно увидеть этот ключ сокращенно HKCC.
  2. HKEY_LOCAL_MACHINE — раздел содержит информацию о конфигурации машины, такие как принтеры, программное обеспечение и информацию сети. Ключ загружается, а затем записи из профиля пользователя переопределяют различные значения. Вы увидите это ключ сокращенно HKLM.
  3. HKEY_USERS — ключ содержит все профили для локальных учетных записей пользователей на машине. Такие вещи, как заставка пользователя, тема информации и другие настройки. У этого ключа аббревиатура HKU.
  4. HKEY_CLASSES_ROOT — ключ является псевдонимом, указывающий на HKEY_LOCAL_MACHINE\Software в котором хранится информация о файле ассоциаций и MIME-типы. Аббревиатура HKCR.
  5. HKEY_CURRENT_USER — ключ является псевдонимом, указывающий на профиль в HKEY_USERS для текущего пользователя. Вы увидите это ключ сокращенно HKCU.

Каждый раздел содержит подразделы, которые в свою очередь содержат другие подразделы, значения конфигурации.

Работа HKEY_CURRENT_USER достаточна для игр с несколькими сценариями CLI и sandbox. Для широкого применения данных системы используется только HKEY_LOCAL_MACHINE, когда вам удобно работать с разрешениями безопасности Microsoft. Понимание того, что является правильным для вашей ситуации, важно знать под какой учетной записью работает PHP, и создать ключи надлежащим образом.

Оформление Sandbox

Я рекомендую создать специальный ключ для использования в скриптах ради безопасности, особенно, когда вы разрабатываете. Человеку свойственно ошибаться, и мы не хотим, чтобы вы случайно переписали что то важное. Организация является еще одной причиной для создания назначенного ключа. В реестре хранится много информации.

Для просмотра и редактирования реестра используется программа Microsoft. Чтобы создать нашу песочницу, перейдите в меню Пуск, введите «regedit» в строке поиска, и выберите regedit.exe в списке результатов, которое появляется.

В левой панели показана древовидная структура существующие ключи в то время как в правой панели отображаются значения, хранящиеся в них. Разверните узел HKEY_CURRENT_USER щелкните правой кнопкой мыши на программное обеспечение и выберите New > Key из всплывающего контекстного меню. Кроме того, мы могли бы также переключаться по дереву с помощью клавиш, так что программное обеспечение будет подсвечена и выберите New > Key из меню Edit . Заполнить имя и нажмите клавишу ввода.

Теперь у нас есть место для игры, позвольте мне познакомить вас с функциями манипулирования записями реестра, которые предлагает win32std.

Чтение из реестра

Функция reg_open_key() открывает подключение к реестру и возвращает ресурс. Этот ресурс затем используется с другими функциями реестра действует исходя из этого соединения. Функция reg_close_key() закрывает соединение.

reg_open_key() принимает два аргумента: первый, предопределенная константа представляет один из пяти основных групп в реестре, остаток пути до нужного ключа.

Теперь у вас есть открытое соединение, вы можете получить информацию из реестра с помощью функций reg_enum_key() , reg_enum_value() и reg_get_value() .

Как только ресурс передается reg_enum_key() он будет возвращать массив подразделов в текущем ключе. Целое значение, также может быть переданы для получения подраздела по определенному индексу.

$subkey) { echo "The subkey at " . $index . " is " . $subkey . "\n"; } // retrieve a specific subkey $index = 2; $subkey = reg_enum_key($reg, $index); echo "The subkey at " . $index . " is " . $subkey . "\n"; ?>

Как reg_enum_key() возвращает ключи, так и reg_enum_value() возвращает значения ключей. Эта функция принимает ресурсы с дополнительным индексом. Название значений могут быть переданы в reg_get_value() для получения значения.

$value) { echo "The value at " . $index . " is " . $value . " and stores "; echo reg_get_value($reg, $value) . "\n"; } // retrieve a specific value given the index $index = 1; $value = reg_enum_value($reg, $index); echo "The value at " . $index . " is " . $value . " and stores "; echo reg_get_value($reg, $value) . "\n"; ?>

Запись в реестр

Есть несколько типов данных, которые вы можете выбрать при чтении и записи в реестре. Они обычно малого значения из-за динамичного характера PHP, но когда вы пишете значение, вы должны указать тип. Большую часть времени вы будете использовать REG_SZ или REG_DWORD, но вот список типов данных, предоставляемых расширения:

  • REG_DWORD — значение хранится как 32-разрядные целые
  • REG_SZ — значение хранится в виде строки фиксированной длины
  • REG_EXPAND_SZ — значение хранится в виде переменной длины
  • REG_MULTI_SZ — значение представляет собой список элементов, разделенных разделителем, такие как пробел или запятая
  • REG_BINARY — значение является строкой с двоичными
  • REG_NONE — значения не имеет определенного типа данных, связанных с ним

Функция reg_set_value() используется для записи значений в реестре. Если значение уже существует, оно будет переписано, если не существует, значение будет создано. Функция принимает четыре аргумента: первый открытый ресурс, название значения, предопределенной константы, представляющие данные значения тип и, наконец, самих данных.

Пример — USB Drive Dongle

Вы можете быть удивлены, есть практическое использование для работы с реестром. Можно хранить информацию о конфигурацию веб-приложения в реестре. Если вы написали приложение, то реестр может быть хорошим местом для хранения всех видов информации с данными приложения с предпочтениях пользователя. Windows, сама пишет всякое интересное и состояние соответствующей информации реестра, и некоторые из них могут быть полезны, если вы достаточно творческий.

Допустим наше приложение PHP было лицензировано, и чтобы запустить его, к серверу должен быть подключен USB ключ. Как PHP определит наличие ключа? Ответ для Windows, лежит в реестре! Каждое устройство имеет уникальный идентификатор, и поэтому сценарий ищет соответствующие ключи для идентификатора.

Первый шаг заключается в определении идентификатора устройства. Для этого примера я буду использовать накопитель. Просто подключите Флешку к порту USB на компьютере, а затем в свойствах Мой компьютер выберите Диспетчер устройств в списке результатов, которые появятся.

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

Windows, регистрирует наличие устройств USB и различные подразделы HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services. На носителях, таких как флэш-накопитель usbstor, usbaudio, usbccgp, и usbehci. Кроме того, отметим, что HKEY_LOCAL_MACHINE будет доступно только привилегированным учетным записям.

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

Это простая проверка, также открывает некоторые другие интересные возможности, можно легко закодировать только админ-интерфейс, который проверяет ключ и запрос отправляется с самого сервера, проверяя $ _SERVER ["REMOTE_ADDR"] . Этот комплекс мер, потребует, чтобы пользователь физически на выделенный сервер и обеспечивает форму физического аутентификации.

В заключение

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

Вверх