2013-10-27 21 views
5

Ich möchte eine Funktion, die überprüft, ob die Elemente eines Arrays eine Zeichenfolge enthalten. Als solche:Enthält das Array (Teil von) String?

array(1 => 'Super-user', 'Root', 'Admin', 'Administrator', 'System', 'Website', 'Owner', 'Manager', 'Founder'); 

Und dann für admin12 Überprüfung sollte als Teil admin12 (admin) ist auch ein Teil des Arrays true zurück.

Also kam ich weit:

$forbiddennames= array(1 => 'Super-user', 'Root', 'Admin', 'Administrator', 'System', 'Website', 'Owner', 'Manager', 'Founder');  

if(in_array(strtolower($stringtocheck), array_map('strtolower', $forbiddennames))){ 
     echo '"This is a forbidden username."'; 
    } else { 
     echo 'true'; 
    } 
} 

Nur dies nur echos "Dies ist eine verbotene Benutzername ist." wenn ich nach admin suche. Ich möchte es auch bei der Überprüfung auf admin12 Echo.

Ist das möglich (und wie)?

+2

glaube ich nicht so viel von einem Duplikat ist mit http://stackoverflow.com/questions/4366730/how -zu-Kontrolle-wenn-eine-Zeichenkette-enthält spezifische Wörter - ein Array von Zeichenketten hat definitiv andere Eigenschaften als nur eine Zeichenkette, und ich versuche, dies mit einer Regexp zu tun. Wie kann man dem widersprechen "als doppelt markiert"? – guaka

Antwort

5

Schleife durch die $forbiddennames Array und stripos verwenden um zu überprüfen, ob die angegebene Eingabezeichenfolge passt zu jedem der Elemente im Array:

function is_forbidden($forbiddennames, $stringtocheck) 
{ 
    foreach ($forbiddennames as $name) { 
     if (stripos($stringtocheck, $name) !== FALSE) { 
      return true; 
     } 
    } 
} 

Und es wie unten verwenden:

if(is_forbidden($forbiddennames, $stringtocheck)) { 
    echo "This is a forbidden username."; 
} else { 
    echo "True"; 
} 

Demo!

+0

Dies erlaubt "admin12" echo zu true, während ich möchte, dass es "dies ist ein ..." echo, weil "admin12" (Eingabe) "Admin" (aus dem f.n.-Array) enthält. – Isaiah

+0

@Isaiah: Das war ein kleiner Fehler von meiner Seite. Ich habe versehentlich die Parameter für 'stripos()' gewechselt. Bitte sehen Sie die aktualisierte Antwort (und die [Demo] (https://eval.in/57770)) –

+0

Ja, Sie haben Recht! – Isaiah

2

Es ist nicht wirklich wichtig, wenn Sie array_map, foreach oder some verwenden Hing anders. Mögliche Lösung:

$forbiddenNames = array('admin', 'bannedName'); 
$input = 'Admin12'; 
$allowed = true; 
foreach($forbiddenNames as $forbiddenName) { 
    if(stripos($input, $forbiddenName) !== false) { 
     echo $input, ' is invalid'; 
     $allowed = false; 
     break; 
    } 
} 
if($allowed === true) { 
    echo $input, ' is valid'; 
} 
+0

Funktioniert auch, danke! – Isaiah

2

möchten Sie PHPs 'strpos' Funktion. Schleife durch jedes Array-Element, und prüfen Sie dann jedes Element gegen ‚strpos‘ PHP strpos reference

foreach($forbiddennames as $fn){ 
if(strpos($stringtocheck,$fn)){ 
    //found it! 
}else{ 
    //not found! 
} 
} 
+0

Warum gehen Sie durch das gesamte Array, wenn es die Möglichkeit gibt, zu brechen, nachdem ein ungültiger Name gefunden wurde? – Rangad

+0

"strripos" ist besser, wenn Sie die Groß-/Kleinschreibung nicht beachten möchten. Ich würde es über 'strpos' verwenden, aber das Codebeispiel wäre grundsätzlich das gleiche –

+1

@ChrisWesson: Das ist anders. Ich glaube, du meintest 'stripos()' (mit einem 'R') :) –

3
foreach ($forbiddennames as $forbiddenname) { 
    $nametocheck = strtolower($stringtocheck); 
    if(strpos($stringtocheck, $forbiddenname) !== false) { 
     echo "This is a forbidden username."; 
     break; 
    } 
} 
+0

Sie sollten nach! == suchen, da strpos auch 0 zurückgeben könnte, wenn eine Übereinstimmung gefunden wird – Rangad

+0

Ja, absolut richtig – Ash