Поиск регулярных выражений




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

14 Comments

  1. alex_gbi

    Вопросы просьбы пожелания?

    Reply
  2. alex_gbi

    Или большенство качает просто так?

    Reply
  3. support

    а ты сделай в обработке открытие этой страницы

    Reply
  4. Robert

    Пожелание. Исправь орфографическую ошибку в заголовке.

    Reply
  5. Pashkaa

    А кто такие регулярные выражения??

    Reply
  6. support

    Помогли исправить

    Reply
  7. alex_gbi

    а в шоке от такого количества комментариев. 🙂

    отвечаю по порядку. 🙂

    2 support: это идея спасибо как то не подумал 🙂

    2 pashkaa: ну для начала можешь спросить у яндекса 🙂 а если вкратце то это такая штука которая помогает искать или разбирать не очень структурированный текст или наоборот структурированные.

    например

    проверить а соответствует ли наименование, заданному шаблону (Фамилия Имя Отчество или Фамилия И. О.) и не допустить иного. Проверить, является ли строка правильным email. и т.д. и т.п.

    Reply
  8. alex_gbi

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

    Используя регулярные выражения, Вы можете:

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

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

    Извлечь подстроку из строки, основываясь на соответствии образцу. Вы можете найти определенный текст в документе или в поле ввода данных.

    Например, если Вам нужно произвести глобальный поиск по всему Web-сайту для удаления некоторого устаревшего материала и для замены отдельных HTML тэгов, Вы можете использовать регулярное выражение для тестирования каждого файла на предмет того, существуют ли в этом файле разыскиваемый материал или HTML тэги. Таким способом Вы можете сузить круг обрабатываемых файлов только до тех, что действительно содержат материал, который должен быть удален или заменен. Затем Вы можете использовать регулярное выражение, чтобы удалить устаревший материал, и, наконец, Вы можете использовать регулярные выражения, чтобы найти и заменить тэги, нуждающиеся в замене.

    Другой пример того, где могут быть полезны регулярные выражения, касается тех языков программирования, которые не имеют развитых возможностей для обработки строк. VBScript, подмножество Visual Basic, имеет богатый набор функций для обработки строк. Но JScript, как и язык C — не имеет. Регулярные выражения обеспечивают существенное расширение возможностей обработки строк в JScript. Однако, регулярные выражения можно эффективно использовать и в VBScript, так как это позволит Вам производить сразу несколько строковых манипуляций в одном выражении.

    Reply
  9. alex_gbi

    http://www.shura.totalcmd.net/download/regexpru.zip

    кое какая справка

    Reply
  10. JohnyDeath

    >проверить а соответствует ли наименование, заданному шаблону (Фамилия Имя Отчество или Фамилия И. О.) и не допустить >иного. Проверить, является ли строка правильным email. и т.д. и т.п.

    Скопировано у Трошева Дмитрия aka trdm. Он в 2005 г. написал обработку «Пример работы с регулярными выражениями в 1С» (для 7.7.). Цитата из этой обработки:

    2005 г. ТрДм

    Для чего? Например, проверить, я соответствует ли наименование,

    заданному шаблону (Фамилия Имя Отчество или Фамилия И. О.) и недопустить

    иного. Проверить, является ли строка правильным email. и т.д. и т.п.

    В обработке демонстрируются варианты готовых патернов регулярных

    выражений, которые сразу вычисляются и показывается результат их работы.

    Вы можете поправить уже имеющиеся или добавить свои и тут-же их

    протеститровать на примерах.

    В описании обработки помещена статья Сергея Колесниченко

    «Шерлок Холмс спешит на помощь вебпрограммисту или регулярные

    выражения на пальцах».

    + Добавил регулирование Опций поиска: IgnoreCase, Multiline, Global

    + Добавил опции вывода результата: Length, FirstIndex, Value.

    Удачи в работе.

    Reply
  11. CheBurator

    а можно пример для решения задачи

    есть например список клиентов вида

    Общестов с ограниченной ответственностью «Вася Пупкин»

    Акционерное общестов «Резерв»

    Индивидуальный предприниматель Иванов И.П.

    и т.п., понятно, что есть

    набор хешей типа

    Общестов с ограниченной ответственностью = ООО

    Акционерное общестов = АО

    Индивидуальный предприниматель = ИП

    ..=АОЗТ

    ..=…

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

    Вася Пупкин ООО

    Иванов И.А. ИП

    Резерв АО



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

    кто-нить поделится решением задачи..? пусть даже не все отрабатывает на 100%, процентов 80% попаданий — тоже устроит..



    тьфу,мне для 7-ки надо..

    но и для 8-ки -пойдет, может осилю..

    Reply
  12. alex_gbi

    Все что ты описал решается на раз.

    В понедельник кину код на семерке как это делать. Если раньше не ответят за меня 🙂

    Reply
  13. alex_gbi

    только что понял а в чем проблема просто поиск замена?

    или я не до конца понял?

    Reply
  14. CheBurator

    В принципе — сделал, по настраиваемым простым шаблонам… ниче так получилось…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *