2012-04-13 15 views
1

Ich habe ein PHP-Array von etwa 20.000 Namen, ich muss durch sie filtern und entfernen Sie alle Namen, die das Wort job, freelance oder project im Namen hat.Eine Reihe von schlechten Wörtern aus einem PHP-Array filtern

Unten ist was ich bisher begonnen habe, es wird durch das Array zyklisch durchlaufen und das gereinigte Element hinzufügen, um ein neues sauberes Array zu erstellen. Ich brauche Hilfe, um die "schlechten" Wörter zu finden. Bitte helfen Sie, wenn Sie können

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

} 

Gerade jetzt ist es ein Wort passt also, wenn „freie“ einen Namen im Array ist es das Element entfernt, aber wenn es so etwas wie ImaFreelaner ist dann ist es nicht, ich brauche etwas zu entfernen das hat die passenden Worte in ihm an allen

+0

Sie Worte passenden '\ b 'sind anzupassen, während Sie den Teil übereinstimmen müssen. Ist es das? – mhitza

Antwort

2

eine regelmäßige Ausdruck ist hier nicht wirklich notwendig - es wäre wahrscheinlich schneller, ein paar stripos Aufrufe zu verwenden. (Performance Angelegenheiten auf dieser Ebene, weil die Suche für jede der 20.000 Namen auftritt.)

Mit array_filter, die nur Elemente in der Anordnung hält, für die der Rückruf true zurückgibt:

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

Hier eine erweiterbare/wartbare Version, in der die Liste der fehlerhaften Wörter aus einem Array geladen werden kann und nicht explizit im Code angegeben werden muss:

1

Dies sollte sein, was Sie wollen:

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

Verwendung der preg_match() Funktion und einige reguläre Ausdrücke sollte es tun; das ist, was ich kam mit und es hat funktioniert an meinem Ende gut:

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

Welche zurückgegeben:

cleanname 
1

Ich persönlich würde so etwas tun:

$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

ich geneigt sein, würde die array_filter Funktion und ändern Sie die Regex zu verwenden, nicht Grenzen, die auf Wort

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

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

Das ist wahrscheinlich die sexieste Lösung von den hier aufgeführten. Aber ich denke '' '' s sollte durch Schrägstriche ersetzt werden, d. H. '/ (Freiberuflich | project | job)/i''. –

Verwandte Themen