2012-12-10 28 views
12

To jest strona czatu. Mam $string = "This dude is a mothertrucker". Mam szereg błędnych słów: $bads = array('truck', 'shot', etc). Jak mogę sprawdzić, czy $string zawiera którekolwiek ze słów w $bad?
Do tej pory mam:Sprawdź, czy ciąg zawiera słowo w tablicy

 foreach ($bads as $bad) { 
     if (strpos($string,$bad) !== false) { 
      //say NO! 
     } 
     else { 
      // YES!   } 
     } 

wyjątkiem, kiedy to zrobić, gdy użytkownik wpisze słowo na liście $bads, wyjście jest NIE! następnie TAK! więc z jakiegoś powodu kod uruchamia go dwukrotnie.

+2

Możesz użyć 'in_array' http://php.net/manual/en/function.in-array.php –

+1

@LearneR Problem polega na tym, że chociaż" ciężarówka "jest złym słowem, to nie robi" t wykryj "mothertrucker", ponieważ wykrywa go dokładnie. Preferuję strpos, ponieważ jest większa elastyczność. – user1879926

+0

Chociaż, ze strpos, można pomylić "klasyczny" za złe słowo nie? Musisz dodać przerwę, gdy znajdziesz złe słowo, aby niepotrzebnie nie przeszukiwać reszty listy. – AEQ

Odpowiedz

46
function contains($str, array $arr) 
{ 
    foreach($arr as $a) { 
     if (stripos($str,$a) !== false) return true; 
    } 
    return false; 
} 
+5

To jest wspaniały! Dlaczego jest tak niska na liście? – harvest316

+3

To działa tylko dla mnie, jeśli zamieniam się na 'stripos ($ str, $ a)' jako łańcuch jest stosem siana –

+0

To samo co @Robert Went, możesz zmienić na 'stripos ($ str, $ a)' –

1

Put i wyjście lub umrzeć raz go znaleźliśmy żadnych brzydkich słów, jak to

foreach ($bads as $bad) { 
if (strpos($string,$bad) !== false) { 
     //say NO! 
} 
else { 
     echo YES; 
     die(); or exit;    
    } 
} 
+0

Dziękuję @Sanjay! To zadziałało! Wszystko, co musiałem zmienić, to wstawić inne wyjście również w tym, jeśli od tego czasu, gdybym NIE miał, powtórzyłoby się to dwa razy. – user1879926

+0

Cześć, ponieważ działa to dla każdej pętli i cały czas sprawdza każde słowo z tablicą niepoprawnych słów. Nie sądzę, że jest to poprawna metoda umieszczania wyjścia w pętli Bez pętli, ponieważ jeśli jest to trzecie lub czwarte słowo jest złym słowem, może nie dać prawidłowego wyniku, więc możesz to sprawdzić. – Sanjay

+0

Tak, masz rację, problem nadal występuje po wyjściu z części if, przepraszam. Ponadto zdałem sobie sprawę, że jeśli wybiorę złe słowo w dalszej części indeksu tablicy, nie powie "NIE". – user1879926

0

pójdę tamtędy jeśli ciąg czat nie jest tak długo.

$badwords = array('motherfucker', 'ass', 'hole'); 
$chatstr = 'This dude is a motherfucker'; 
$chatstrArr = explode(' ',$chatstr); 
$badwordfound = false; 
foreach ($chatstrArr as $k => $v) { 
    if (in_array($v,$badwords)) {$badwordfound = true; break;} 
    foreach($badwords as $kb => $vb) { 
     if (strstr($v, $kb)) $badwordfound = true; 
     break; 
    } 
} 
if ($badwordfound) { echo 'Youre nasty!';} 
else echo 'GoodGuy!'; 
+0

zmienić linię foreach dla tego: foreach ($ chatstrArr jak $ k => $ v) { foreach ($ BADWORDS jako $ kb => $ VB) { || strstr ($ v, $ vb) {$ badwordfound = true; break;} – Graben

+0

Cholerne pole komentarza nie pozwala mi wprowadzać modyfikacji kodu ... Zmieniono moją odpowiedź, aby wyszukać wszystkie błędne hasła we wszystkich słowach napisów na czacie – Graben

1

Chcesz tego?

$string = "This dude is a mothertrucker"; 
$bads = array('truck', 'shot', 'mothertrucker'); 

    foreach ($bads as $bad) { 
     if (strstr($string,$bad) !== false) { 
      echo 'NO<br>'; 
     } 
     else { 
      echo 'YES<br>'; 
     } 
    } 
7

można proszę spróbować zamiast kodu

$string = "This dude is a mothertrucker"; 
$bads = array('truck', 'shot'); 
foreach($bads as $bad) { 
    $place = strpos($string, $bad); 
    if (!empty($place)) { 
     echo 'Bad word'; 
     exit; 
    } else { 
     echo "Good"; 
    } 
} 
+0

Dziękuję za to! Udało mi się wykorzystać ten przykład kodu, by pomóc w tworzeniu filtra czatu do gry na komórki. Dobra robota! –

8

1) najprostszy sposób:

$yourWord='nine'; 
$targets = array("four", "eleven", "nine", "six"); 

if (in_array($yourWord, $targets)) { 
    echo "FOUND!!"; 
} 

2) Innym sposobem (podczas sprawdzania tablic ku innym tablice):

$keywords=array('one','two','three'); 
$targets=array('eleven','six','two'); 
foreach ($targets as $string) 
{ 
    foreach ($keywords as $keyword) 
    { 
    if (strpos($string, $keyword) !== FALSE) 
    { echo "The word appeared !!" } 
    } 
} 
+2

Oba te przykłady działają gorzej niż inne [odpowiedzi] (http://stackoverflow.com/a/13795849/630996) na to pytanie. Pierwszy, jak jest napisany, ma algorytmiczną złożoność O (1), ale aby działało, biorąc pod uwagę pierwotne pytanie OP, należałoby zapętlić wszystkie słowa w komunikacie czatu, co dałoby mu O (N) (gdzie N jest liczbą słów w ciągu). Ponieważ długość wiadomości na czacie może się różnić, wydajność będzie się zmniejszać wraz ze wzrostem długości wiadomości. A drugi to O (M * N) ze względu na podwójną pętlę. – AngeloS

3

Możesz odwrócić tablicę złych słów i zrobić to samo sprawdzanie znacznie szybciej. Zdefiniuj każde złe słowo jako klucz tablicy. Na przykład,

//define global variable that is available to too part of php script 
//you don't want to redefine the array each time you call the function 
//as a work around you may write a class if you don't want global variable 
$GLOBALS['bad_words']= array('truck' => true, 'shot' => true); 

function containsBadWord($str){ 
    //get rid of extra white spaces at the end and beginning of the string 
    $str= trim($str); 
    //replace multiple white spaces next to each other with single space. 
    //So we don't have problem when we use explode on the string(we dont want empty elements in the array) 
    $str= preg_replace('/\s+/', ' ', $str); 

    $word_list= explode(" ", $str); 
    foreach($word_list as $word){ 
     if(isset($GLOBALS['bad_words'][$word])){ 
      return true; 
     } 
    } 
    return false; 
} 

$string = "This dude is a mothertrucker"; 

if (!containsBadWord($string)){ 
    //doesn't contain bad word 
} 
else{ 
    //contains bad word 
} 

W tym kodzie jesteśmy po prostu sprawdzenie, czy indeks istnieje zamiast porównując złe słowo z wszystkich słów w liście złych słów.
isset jest znacznie szybszy niż in_array i marginalnie szybszy niż array_key_exists.
Upewnij się, że żadna z wartości w tablicy złych słów nie jest ustawiona na wartość null.
isset zwróci wartość false, jeśli indeks tablicy ma wartość null.

0
$string = "This dude is a good man"; 
$bad = array('truck','shot','etc'); 
$flag='0';   
foreach($bad as $word){   
    if(in_array($word,$string))   
    {  
     $flag=1;  
    }  
}  
if($flag==1) 
    echo "Exist"; 
else 
    echo "Not Exist"; 
0

Jest bardzo krótki skrypt php, który można użyć do identyfikacji złych słów w ciąg, który wykorzystuje str_ireplace następująco:

$string = "This dude is a mean mothertrucker"; 
$badwords = array('truck', 'shot', 'ass'); 
$banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false; 
if ($banstring) { 
    echo 'Bad words found'; 
} else { 
    echo 'No bad words in the string'; 
} 

Pojedyncza linia:

$banstring = ($string != str_ireplace($badwords,"XX",$string))? true: false; 

robi cała praca.

0

Jeśli chcesz zrobić z array_intersect(), a następnie skorzystać z poniższego kodu:

function checkString(array $arr, $str) { 

    $str = preg_replace(array('/[^ \w]+/', '/\s+/'), ' ', strtolower($str)); // Remove Special Characters and extra spaces -or- convert to LowerCase 

    $matchedString = array_intersect(explode(' ', $str), $arr); 

    if (count($matchedString) > 0) { 
    return true; 
    } 
    return false; 
} 
0

Choć dont't znać PHP, to wydaje się proste programowanie problem.You może po prostu tokenize ciąg i używać mapę podobną do struktury, która zlicza występowanie każdego słowa, a następnie możesz po prostu sprawdzić każde złe słowo na mapie.Mapa będzie zawierała słowa jako klucz i wartość, ile razy słowo pojawia się w łańcuchu. A następnie wystarczy wyszukać mapę dla każdego złego słowa.

Powiązane problemy