php 从字符串中删除除白名单短语外的所有字符,并删除空元素

fjaof16o  于 2023-06-04  发布在  PHP
关注(0)|答案(2)|浏览(343)

我需要在php中使用preg_replace()来删除除了$querys数组中的字符串之外的所有字符串。
此外,不包含白名单单词的元素应被删除。
在字符串中:

$text = [
   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 = [
   0 => 'Tomada de Preços',
   1 => 'PREGÃO ELETRÔNICO',
   3 => 'CONCORRÊNCIA PÚBLICA',
];
t5zmwmid

t5zmwmid1#

最直接地说,这是preg_filter()的一个很好的用例,假设您只期望为每个元素找到一个匹配。(Demo

var_export(
    preg_filter('/.*\b(' . implode('|', $whitelist) . ')\b.*/', '$1', $inputs)
);

更详细的解决方案是循环preg_match()preg_replace()调用,并有条件地推入结果数组。
如果你的输入可能包含regex中有特殊含义的字符,你需要在内爆之前对这些值调用preg_quote()
(*SKIP)(*FAIL)技巧有效地避免了删除白名单中的子字符串。其他所有内容都通过.*?匹配被咀嚼和吐出。
代码:(Demo

$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);

或:(Demo

$result = [];
foreach ($inputs as $i => $input) {
    if (preg_match('/\b(?:' . implode('|', $whitelist) . ')\b/', $input, $m)) {
        $result[$i] = $m[0];
    }
}
var_export($result);

输出:

array (
  0 => 'Tomada de Preços',
  1 => 'PREGÃO ELETRÔNICO',
  3 => 'CONCORRÊNCIA PÚBLICA',
)
xqkwcwgp

xqkwcwgp2#

我的猜测是,也许一些简单的表达式,如以下可能是确定的研究:

\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的右上角面板中有解释。如果你愿意,你也可以在this link中观察它是如何与一些样本输入匹配的。

相关问题