Я пытаюсь очистить базу данных электронной почты, которая была импортирована из таблицы Excel. Так что в одной ячейке много плохих персонажей и даже два-три электронных письма. Я не хочу использовать прямое решение для базы данных, как было размещено здесь (T-SQL: проверка формата электронной почты), потому что я сделаю двойную проверку на глаз, прежде чем фактически исключить ее.
1) Сначала я получил все те электронные письма, которые не были в хорошей форме. Затем я преобразовал их в массив. Обратите внимание, что я нахожусь в экосистеме Laravel.
$contato = DB::select("select * from emailstable where outro_email NOT REGEXP '^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]\.[a-zA-Z]{2,4}$'");
$email_array = json_decode(json_encode($email_database_as_object), true);
2) Из них я удалил все записи, на которых нет символа @ (пустые, нулевые, случайные фразы), исключив их из исходного массива:
$corretor = preg_grep("/@/i", array_column($email_array, "email"), PREG_GREP_INVERT);
foreach ($corretor as $key => $value) {
$email_array = array_except($email_array, array($key));
}
Но самая большая проблема заключается в том, что когда я пытаюсь удалить плохие символы, preg_grep назначает результирующему массиву новые ключи массива. Вместо того, чтобы сохранить оригинальные.
В качестве примера:
Ключи исходного массива, которые были отфильтрованы: 1,4,10,24,34,65,78 (7 ключей)
Назначенные ключи: 0,1,2,3,4,5,6
В моем коде я пытаюсь извлечь несколько электронных писем, которые были вставлены в одну ячейку, через разделители как «;» , «, ‘и» «, используя preg_grep:
$email_corrected = array(); //array to get all of the corrected emails
$corretor = preg_grep("/;/i", array_column($email_array, "outro_email"));
foreach ($corretor as $key => $value) {
$provisorio = explode(';', $value);
$provisorio = array_where($provisorio, function($chave, $valor)
{
return strlen($valor) > 0;
}); //laravel function to take out empty results of explode
$provisorio=array_map('trim',$provisorio);
$email_corrected[$key] = $provisorio; //adds the result to corrected emails
$email_array = array_except($email_array, array($key)); // takes out the result from the original array
}$corretor = preg_grep("/,/i", array_column($email_array, "outro_email"));
foreach ($corretor as $key => $value) {
$provisorio = explode(',', $value);
$provisorio = array_where($provisorio, function($chave, $valor)
{
return strlen($valor) > 0;
});
$provisorio=array_map('trim',$provisorio);
$email_corrected[$key] = $provisorio;
$email_array = array_except($email_array, array($key));
}
$corretor = preg_grep("/\//", array_column($contato_array, "outro_email"));
foreach ($corretor as $key => $value) {
$provisorio = explode(',', $value);
$provisorio = array_where($provisorio, function($chave, $valor)
{
return strlen($valor) > 0;
});
$provisorio=array_map('trim',$provisorio);
$email_corrected[$key] = $provisorio;
$email_array = array_except($email_array, array($key));
}
Но после каждого preg_grep ключи из $ corretor не совпадают с исходными ключами из $ email_array. В результате я не удаляю правильные ключи из исходного массива при выполнении $ email_array = array_except ($ email_array, array ($ key));
Заранее спасибо.
Задача ещё не решена.
Других решений пока нет …