我有一个大约 20,000 个名称的 PHP 数组,我需要过滤它并删除任何名称中包含单词 job
、freelance
或 project
的名称。
下面是我到目前为止已经开始的内容,它将循环遍历数组并添加清理的项目以构建一个新的干净数组。 不过,我需要帮助匹配"坏"词。 如果可以,请提供帮助
$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;
}
}
现在它匹配一个单词,所以如果"自由职业者"是数组中的名字,它会删除该项目,但如果它是类似ImaFreelaner
那么它不会,我需要删除任何包含匹配单词的内容
正则表达式在这里并不是必需的——使用一些stripos
调用可能会更快。(性能在此级别很重要,因为搜索针对 20,000 个名称中的每一个都进行。
使用 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;
});
我倾向于使用 array_filter 函数并将正则表达式更改为在单词边界上不匹配
$data1 = array('Phillyfreelance' , 'PhillyWebJobs', 'web2project', 'cleanname');
$cleanArray = array_filter($data1, function($w) {
return !preg_match('~(freelance|project|job)~i', $w);
});
使用 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
就个人而言,我会做这样的事情:
$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;
});
这应该是你想要的:
if (!preg_match('/(freelance|job|project)/i', $name)) {
$cleanArray[] = $name;
}