Соображение reg comp php. Скачать Reg Organizer - очистка и оптимизация системы. Освобождение буфера шаблона POSIX

Всем привет сегодня хочу рассказать вам о программе Reg Organizer. Это программа с множеством функций для полного обслуживания ОС семейства Windows. Reg Organizer отлично подойдет для Windows XP, Vista, 7, 8.1 и 10. С помощью данной программы вы можете ускорить и оптимизировать работу ОС на вашем компьютере, высвобождая дополнительные ресурсы.

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

Что может Reg Organizer?

  • Reg Organizer поможет полностью деинсталлировать программу, удалить ее остатки, не допуская захламление реестра и дисков компьютера.
  • Очистка автозагрузки (автозапуска) поможет удалить приложения, которые запускаются вместе с Windows. Это позволяет ускорить загрузку операционной системы Windows, а также высвободить часть ресурсов компьютера. Кроме того в разделе автозагрузки можно также удалить любые запланированные задачи.
  • Чистка дисков в автоматическом режиме позволит освободить большое количество свободного места на системном диске. Можно удалять все то что Windows сама за собой не чистит.
  • С помощью тонких настроек в Reg Organizer можно настроить работу ОС Windows под свои нужды.
  • Чистка реестра - Reg Organizer самостоятельно найдет и устранит все ненужные и ошибочные записи в системном реестре Windows, которые могут влиять на стабильность работы.
  • Reg Organizer позволяет оптимизировать реестр, проводить сжатие файлов системного реестра и может дефрагментировать его.
  • Удобный редактор реестра в Reg Organizer поможет производить различные операции с системным реестром, в том числе экспортировать, импортировать, копировать значения ключей и многое другое.
  • Легкий поиск и замена ключей в реестре - позволяет найти необходимые ключи и удалить их при необходимости. В случае, когда приложения не имеют программу деинсталляции или после его удаления приложения "вручную" в реестре остаются записи, которые могут вызывать конфликты в реестре, в этом случае будет полезна функция поиска и замены ключей реестра. Reg Organizer производит глубокий поиск и позволяет зачастую найти даже то, что другие программы не находят.
  • Reg Organizer может отслеживать все то, что делает программа при установке и в случае возникновения каких либо проблем, можно отменить все то, что попыталась внести программа при установке.
  • Программа может находить оставшиеся следы от уже удаленных программ. в случае если вы удалили программу некорректно Reg Organizer поможет очистить следы от удаленной программы.

Более подробно о всех возможностях Reg Organizer можете посмотреть в моем видео:


Скачать Reg Organizer с официального сайта вы можете по любой из кнопок скачать.

Для начала мы усовершенствуем страничку регистрации, добавив возможность загружать аватар. Исходное изображение должно быть формата 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("");
// отправляем пользователя на главную страницу.
?>

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

Содержание

ereg

ereg -- парное значение регулярного выражения
Описание
int ereg (string pattern, string string, array );

Ищет парные значения string в регулярном выражении, указанном в pattern .

Если парные значения найдены для подстрок в круглых скобках pattern и функция вызывалась с третьим аргументом regs , то парные значения будут сохранены в элементах regs . $regs будет содержать подстроку, которая начинается с первой левой круглой скобки; $regs будет содержать подстроку, начинающуюся со второй скобки и т.д. $regs будет содержать копию string .

Поиск чуствителен к регистру.

Функция возвращает true, если парное значение для pattern было найдено в string, или false, если не было найдено парных значений или произошла ошибка.

Следующий код извлекает дату в ISO формате и выводит в формате DD.MM.YYYY:

Example 1. ereg() example

If (ereg("({4})-({1,2})-({1,2})", $date, $regs)) { echo "$regs.$regs.$regs"; } else { echo "Invalid date format: $date"; }

ereg_replace

ereg_replace -- заменяет регулярное выражение
Описание
string ereg_replace (string pattern, string replacement, string string);

Эта функция сканирует string на парные значения к pattern , затем заменяет найденный текст на replacement .

Если pattern содержит подстроки в круглых скобках, то replacement может содержать подстроки вида \\ цифра , которые будут заменены текстом, совпадающим с цифровой подстрокой в скобках; \\0 обработает все содержимое строки. Может быть использовано до 9 подстрок. Скобки могут быть сгруппированы, в этом случае они считаются по открывающим скобкам. Например, следующий код напечатет "This was a test" три раза:

Пример 1. ereg_replace()

$string = "This is a test"; echo ereg_replace(" is", " was", $string); echo ereg_replace("()is", "\\1was", $string); echo ereg_replace("(()is)", "\\2was", $string);

См. также , , и .

eregi

eregi -- нечувствительный к регистру поиск парных значений в регулярных выражениях
Описание
int eregi (string pattern, string string, array );

eregi_replace

eregi_replace -- замена регулярного выражения без учета регистра
Описание
string eregi_replace (string pattern, string replacement, string string);

split

split -- разбивает строку на массив по регулярному выражению
Описание
array split (string pattern, string string, int );

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

Для получения первых 5 полей из строки в /etc/passwd:

Будет выдано .

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

Данную статью я решил посветить всем начинающим изучать PHP , потому что у всех возникает одна и та же ошибка. Почему её допускают, не знаю, но допускают постоянно. Я без преувеличений скажу, что получил уже около сотни вопросов, на которые ответ будет дан в этой статье. Эта ошибка связана с неправильным запуском в PHP .

Как делают практически все новички:

  1. Создают PHP-файл (иногда HTML-файл , но это самые новички).
  2. Записывают туда PHP-код .
  3. И двойным кликом пытаются открыть его в браузере.

Результат, браузер код открывает, но исполнять его не торопится. А просто выводит какие-то куски кода обычным текстом, либо вообще ничего не выводит.

Ошибка данного подхода состоит в том, что ученик не понимает, что PHP - это серверный язык , а не клиентский. Это HTML или JavaScript клиентские языки, они, конечно, обрабатываются браузером. Но для PHP нужен интерпритатор . И вот данный интерпритатор запускается сервером.

Вывод: запускать PHP-код надо через сервер . Если у Вас Denwer , значит, через него.

Теперь, как запускать PHP-код через Denwer . Большинство новичков вновь делают ошибку. Они вроде бы всё делают правильно, создают нужные папки, перезапускают Denwer и вроде бы, осталось только правильно вызвать файл. Но тут снова ошибка: они вновь открывают файл просто в браузере (либо перетаскиванием файла в браузер, либо двойным кликом). Это легко можно заметить по адресу в адресной строке. Там будет что-то наподобие: file:///Z:\home\mysite.local\www\script.php .

А правильно запускать надо, вводя адрес виртуального хоста . То есть прямо в адресной строке браузера вводите: http://mysite.local/script.php - всё, теперь скрипт запустится и выведет свой результат.

Надеюсь, данная статья поможет многим новичкам, только начинающим изучать PHP .

#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 Неправильная обратная ссылка на подвыражение.