2012-04-13 8 views
1

私は約20,000の名前のPHP配列を持っています。それをフィルタリングし、jobfreelance、またはprojectという名前の名前を削除する必要があります。PHP配列から悪い単語をフィルタリングする

以下は私がこれまでに始めたことですが、アレイ全体を循環して、クリーンなアイテムを追加して新しいクリーンなアレイを構築します。私は "悪い"言葉にマッチする助けが必要です。 「フリーランス」は、それはその項目が削除されますが、それはImaFreelanerのようなものであるならば、それは、私が何かを削除する必要はありません配列内の名前である場合は、

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

} 

今のところはそう言葉に一致することができれば助けてくださいそれは、すべての

+0

に一致しないために正規表現を変更するために傾いているはずです。それですか? – mhitza

答えて

2

定期的に

<?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,',')); 
?> 

返さ:これは私が思い付いた、それは私の終わりにうまく働いたものです表現はここでは本当に必要ではありません - それはおそらくいくつかのstriposコールを使用する方が速いでしょう。 (このレベルでのパフォーマンスの問題は、検索が20,000名のそれぞれのために発生しているため。)

のみコールバックがtrueを返すために配列の要素を保持しarray_filter、付:

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

ここですコード内に明示的に示される必要はなく、不正な単語のリストを配列から読み込むことができる、拡張性が高く保守可能なバージョンです。

1

これで、それに一致する単語があなたが欲しいものをする必要がありますがあります。

if (!preg_match('/(freelance|job|project)/i', $name)) { 
    $cleanArray[] = $name; 
} 
1

preg_match()機能を使用すると、いくつかの正規表現は、トリックを行う必要があります。私はこのような何かをするだろう、個人的に

cleanname 
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; 
}); 
2

私はarray_filter機能を使用して、部分文字列に一致する必要がありながら、あなたは言葉 `\ B`に一致している単語の境界

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

$cleanArray = array_filter($data1, function($w) { 
    return !preg_match('~(freelance|project|job)~i', $w); 
}); 
+0

おそらく、ここに挙げたものの中でも最もセクシーな解決策です。しかし、 '〜'はスラッシュ( '' /(フリーランス|プロジェクト|仕事)/ i '')に置き換えてください。 –

関連する問題