регулярное выражение исключить все, кроме конкретной строки - php - PullRequest
0 голосов
/ 26 сентября 2019

** Мне нужно использовать preg_replace () в php, чтобы удалить все строковые слова, кроме слов в массиве $ querys **

В строке:

$text = Array
(
   [0] => Tomada de Preços nº 003/2019
   [1] => PREGÃO ELETRÔNICO Nº 001/2019
   [2] => Processo Nº 011/2019
   [3] => Aviso de Licitação CONCORRÊNCIA PÚBLICA Nº 3/2019
);


$querys =["CONCORRÊNCIA","Tomada de Preços","PREGÃO ELETRÔNICO"];

$Result = Array
(
   [0] => Tomada de Preços
   [1] => PREGÃO ELETRÔNICO
   [3] => CONCORRÊNCIA PÚBLICA
);

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

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

Если ваши входные данные могут содержать символы со специальным значением в регулярном выражении, вам нужно будет вызвать 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',
)
0 голосов
/ 26 сентября 2019

Я предполагаю, что, возможно, можно рассмотреть какое-нибудь простое выражение, такое как следующее:

\b(?:CONCORRÊNCIA|Tomada de Preços|PREGÃO ELETRÔNICO)\b

Тест

$re = '/\b(?:CONCORRÊNCIA|Tomada de Preços|PREGÃO ELETRÔNICO)\b/s';

$arr = array(
    '0' => 'Tomada de Preços nº 003/2019',
    '1' => 'PREGÃO ELETRÔNICO Nº 001/2019',
    '2' => 'Processo Nº 011/2019',
    '3' => 'Aviso de Licitação CONCORRÊNCIA PÚBLICA Nº 3/2019',
);

$result = array();

foreach ($arr as $value) {
    if (preg_match_all($re, $value, $matches[0])) {
        preg_match($re, $value, $matches);
        array_push($result, $matches[0]);
    }
}

var_dump($result);

Вывод

array(3) {
  [0]=>
  string(17) "Tomada de Preços"
  [1]=>
  string(19) "PREGÃO ELETRÔNICO"
  [2]=>
  string(13) "CONCORRÊNCIA"
}

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


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...