2012-12-10 21 views
12

में शब्द है या नहीं, यह चैट पेज के लिए है। मेरे पास $string = "This dude is a mothertrucker" है। मेरे पास Badwords की एक सरणी है: $bads = array('truck', 'shot', etc)$string में $bad में से कोई भी शब्द क्या है, यह देखने के लिए मैं कैसे जांच सकता हूं?
अब तक मेरे पास है:जांचें कि स्ट्रिंग में सरणी

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

छोड़कर जब मैं ऐसा करते हैं, जब $bads सूची में एक शब्द में एक उपयोगकर्ता प्रकार, उत्पादन नहीं है! हाँ के बाद! इसलिए किसी कारण से कोड इसे दो बार चला रहा है।

+2

आप 'in_array' http://php.net/manual/en/function.in-array.php –

+1

@LearneR का उपयोग कर सकते हैं समस्या यह है कि 'ट्रक' एक बुरा शब्द है, यह ' टी 'मातृभाषा' का पता लगाने के बाद से यह सटीकता से पता चलता है। मैं स्ट्रैप पसंद करता हूं क्योंकि अधिक लचीलापन है। – user1879926

+0

हालांकि, स्ट्रॉप्स के साथ, आप खराब शब्द संख्या के लिए "क्लासिक" गलती कर सकते हैं? आपको शेष सूची को अनावश्यक रूप से जाने से रोकने के लिए एक बुरा शब्द खोजने पर आपको ब्रेक जोड़ने की आवश्यकता है। – AEQ

उत्तर

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

यह सुन्दर है! सूची में यह इतना कम क्यों है? – harvest316

+3

यह केवल मेरे लिए काम करता है अगर मैं 'स्ट्रिप्स ($ str, $ a) 'पर स्वैप करता हूं क्योंकि स्ट्रिंग हैस्टैक –

+0

@Robert Went के समान है, तो आप' stripos ($ str, $ a)' –

1

रख दिया और बाहर निकलें या एक बार यह किसी भी बुरा शब्द ढूँढ़ने मर जाते हैं, इस

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

धन्यवाद @ संजय! यह काम किया! मुझे बस इतना बदलना पड़ा कि अगर मैं नहीं करता तो दो बार प्रतिबिंबित किया जाएगा। – user1879926

+0

नमस्ते ऐसा इसलिए है क्योंकि यह प्रत्येक पाश के लिए काम करता है और हर बार यह आपके शब्दों को आपके बुरे शब्द सरणी के साथ जांचता है। मुझे नहीं लगता कि यह कोई लूप पर बाहर निकलने का एक सही तरीका है, क्योंकि अगर तीसरा या चौथा शब्द एक बुरा शब्द है यह आपको सही परिणाम नहीं दे सकता है, तो क्या आप इसे जांच सकते हैं। – Sanjay

+0

हां, आप सही हैं, समस्या अगर भाग में बाहर निकलने के साथ बनी रहती है, क्षमा करें। साथ ही, मुझे एहसास हुआ कि अगर मैंने सरणी के इंडेक्सो के नीचे एक बुरा शब्द चुना है, तो यह नहीं कहेंगे। – user1879926

0

की तरह मुझे लगता है कि मदद मिलेगी अगर चैट स्ट्रिंग कि लंबे समय नहीं है।

$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

इस के लिए foreach लाइन बदलने स्ट्रस्ट्र ($ v, $ vb) {$ badwordfound = true; ब्रेक;} – Graben

+0

डॉन टिप्पणी बॉक्स मुझे कोड मोडिफ़ दर्ज नहीं करेगा ... मैंने सभी चैट स्ट्रिंग शब्दों में सभी Badwords के लिए खोज करने के लिए अपनी प्रतिक्रिया बदल दी – Graben

1

यह चाहता था?

$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

आप इस बजाय अपने कोड

$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

इसके लिए धन्यवाद! मैं मोबाइल कोड के लिए चैट फ़िल्टर बनाने में सहायता के लिए इस कोड उदाहरण का उपयोग करने में सक्षम था। बहुत बढ़िया! –

8

1) का सबसे सरल तरीका प्रयास करें कर सकते हैं:

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

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

2) एक और तरीका है (जबकि एक अन्य की ओर सरणियों जाँच सरणी):

$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

इन दोनों उदाहरणों में इस प्रश्न के लिए अन्य [उत्तरों] (http://stackoverflow.com/a/13795849/630996) से भी बदतर है। जैसा कि लिखा गया है, ओ (1) की बिग-ओ एल्गोरिदमिक जटिलता है, लेकिन इसे ओपी के मूल प्रश्न के बाद काम करने के लिए, चैट संदेश में सभी शब्दों के माध्यम से लूप करना होगा, जो इसे ओ (एन) (जहां एन स्ट्रिंग में शब्दों की संख्या है)। चूंकि चैट संदेश की लंबाई अलग-अलग हो सकती है, इसलिए संदेश बढ़ने की लंबाई के रूप में प्रदर्शन घट जाएगा। और दूसरा डबल लूप के कारण ओ (एम * एन) है। – AngeloS

3

आप अपने खराब शब्द सरणी को फ़्लिप कर सकते हैं और उसी जांच को बहुत तेज कर सकते हैं। प्रत्येक खराब शब्द को सरणी की कुंजी के रूप में परिभाषित करें। उदाहरण के लिए,

//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 
} 

इस कोड में हम सिर्फ एक सूचकांक बुरा शब्द सूची में सभी शब्दों के साथ बुरा शब्द की तुलना बजाय मौजूद है, तो जाँच कर रहे हैं।
जारीकर्ता in_array की तुलना में बहुत तेज है और array_key_exists की तुलना में मामूली तेज़ है।
सुनिश्चित करें कि खराब शब्द सरणी में कोई भी मान शून्य पर सेट नहीं है।
इन्सेट झूठी वापसी करेगा यदि सरणी अनुक्रमणिका शून्य पर सेट है।

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

एक बहुत ही कम PHP स्क्रिप्ट है कि आप एक स्ट्रिंग के रूप में निम्नानुसार जो str_ireplace का उपयोग करता है में बुरे शब्दों को पहचानने के लिए उपयोग कर सकते हैं:

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

ही पंक्ति:

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

करता है पूरा काम।

0

आप array_intersect() के साथ क्या करना चाहते हैं, तो नीचे दिए गए कोड का उपयोग करें:

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

हालांकि मैं जानता हूँ कि php dont't, यह एक सरल प्रोग्रामिंग लगता problem.You सिर्फ स्ट्रिंग tokenize और एक इस्तेमाल कर सकते हैं संरचना की तरह नक्शा जो प्रत्येक शब्द की घटना की गणना करता है और फिर आप मानचित्र में हर खराब शब्द को पार कर सकते हैं।नक्शा में शब्द और कुंजी के रूप में शब्द होंगे क्योंकि शब्द स्ट्रिंग में कितनी बार आ रहा है। और फिर आपको केवल प्रत्येक बुरे शब्द के लिए मानचित्र देखना है।

संबंधित मुद्दे