1

私は約 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は、一致する単語が含まれているものをすべて削除する必要があります

4

5 に答える 5

2

ここでは、正規表現は実際には必要ありません — いくつかの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;
});
于 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 に答える