1

我有一个包含大约 20,000 个名称的 PHP 数组,我需要对其进行过滤并删除名称中包含单词jobfreelanceproject的任何名称。

下面是我到目前为止开始的内容,它将循环遍历数组并添加清理过的项目以构建一个新的清理数组。不过,我需要帮助匹配“坏”词。如果可以的话请帮忙

$data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname');

// freelance
// job
// project

$cleanArray = array();
foreach ($data1 as $name) {
    # if a term is matched, we remove it from our array
    if(preg_match('~\b(freelance|job|project)\b~i',$name)){
        echo 'word removed';

    }else{
        $cleanArray[] = $name;
    }

}

现在它匹配一个单词,所以如果“freelance”是数组中的一个名称,它会删除该项目,但如果它是类似的,ImaFreelaner那么它不会,我需要删除任何包含匹配单词的东西

4

5 回答 5

2

这里不需要正则表达式——使用几个stripos调用可能会更快。(性能在此级别上很重要,因为搜索会针对 20,000 个名称中的每一个进行。)

With array_filter,它只保留回调返回的数组中的元素true

$data1 = array_filter($data1, function($el) {
        return stripos($el, 'job') === FALSE
            && stripos($el, 'freelance') === FALSE
            && stripos($el, 'project') === FALSE;
});

这是一个更可扩展/可维护的版本,可以从数组中加载坏词列表,而不必在代码中明确表示:

$data1 = array_filter($data1, function($el) {
        $bad_words = array('job', 'freelance', 'project');
        $word_okay = true;

        foreach ( $bad_words as $bad_word ) {
            if ( stripos($el, $bad_word) !== FALSE ) {
                $word_okay = false;
                break;
            }
        }

        return $word_okay;
});
于 2012-04-13T13:07:09.997 回答
2

我倾向于使用array_filter函数并将正则表达式更改为在单词边界上不匹配

$data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname');

$cleanArray = array_filter($data1, function($w) { 
     return !preg_match('~(freelance|project|job)~i', $w); 
});
于 2012-04-13T13:13:28.310 回答
1

这应该是你想要的:

if (!preg_match('/(freelance|job|project)/i', $name)) {
    $cleanArray[] = $name;
}
于 2012-04-13T12:58:00.960 回答
1

使用该preg_match()函数和一些正则表达式应该可以解决问题;这就是我想出的,它对我来说效果很好:

<?php
    $data1=array('JoomlaFreelance','PhillyWebJobs','web2project','cleanname');
    $cleanArray=array();
    $badWords='/(job|freelance|project)/i';
    foreach($data1 as $name) {
        if(!preg_match($badWords,$name)) {
            $cleanArray[]=$name;
        }
    }
    echo(implode($cleanArray,','));
?>

哪个返回:

cleanname
于 2012-04-13T13:06:47.157 回答
1

就个人而言,我会做这样的事情:

$badWords = ['job', 'freelance', 'project'];
$names = ['JoomlaFreelance', 'PhillyWebJobs', 'web2project', 'cleanname'];

// Escape characters with special meaning in regular expressions.
$quotedBadWords = array_map(function($word) {
    return preg_quote($word, '/');
}, $badWords);

// Create the regular expression.
$badWordsRegex = implode('|', $quotedBadWords);

// Filter out any names that match the bad words.
$cleanNames = array_filter($names, function($name) use ($badWordsRegex) {
    return preg_match('/' . $badWordsRegex . '/i', $name) === FALSE;
});
于 2012-04-13T13:06:58.420 回答