Как я понимаю вашу задачу, вы хотите удалить все символы, не входящие в ваш белый список значений, а затем отфильтровать все элементы, которые не содержат символов.Мой следующий фрагмент будет делать это только с одним вызовом регулярного выражения за итерацию.
Если ваши входные данные могут содержать символы со специальным значением в регулярном выражении, вам нужно будет вызвать preg_quote()
для этих значений перед имплозией.
Трюк (*SKIP)(*FAIL)
эффективно избегает удаления подстрок из белого списка.Все остальное разжевывается и выплевывается с помощью .*?
соответствия.
Код: ( Демо )
$inputs = [
'Tomada de Preços nº 003/2019',
'PREGÃO ELETRÔNICO Nº 001/2019',
'Processo Nº 011/2019',
'Aviso de Licitação CONCORRÊNCIA PÚBLICA Nº 3/2019',
];
$whitelist = [
'CONCORRÊNCIA PÚBLICA',
'Tomada de Preços',
'PREGÃO ELETRÔNICO'
];
$pattern = '/\b(?:' . implode('|', $whitelist) . ')\b(*SKIP)(*FAIL)|.*?/';
foreach ($inputs as $i => $input) {
$inputs[$i] = preg_replace($pattern, '', $input);
if (!$inputs[$i]) {
unset($inputs[$i]);
}
}
var_export($inputs);
Вывод:
array (
0 => 'Tomada de Preços',
1 => 'PREGÃO ELETRÔNICO',
3 => 'CONCORRÊNCIA PÚBLICA',
)