Это для чат-страницы. У меня есть $string = "This dude is a mothertrucker"
. У меня есть множество badwords: $bads = array('truck', 'shot', etc)
. $bads = array('truck', 'shot', etc)
. Как я могу проверить, содержит ли $string
любое слово из $bad
?
Пока у меня есть:
foreach ($bads as $bad) { if (strpos($string,$bad) !== false) { //say NO! } else { // YES! } }
За исключением случаев, когда я делаю это, когда пользователь вводит слово в списке $bads
, вывод НЕТ! затем ДА! поэтому по какой-то причине код запускает его дважды.
function contains($str, array $arr) { foreach($arr as $a) { if (stripos($str,$a) !== false) return true; } return false; }
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 !!" } } }
вы можете попробовать это вместо своего кода
$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"; } }
Вы можете перевернуть свой плохой массив слов и сделать такую же проверку намного быстрее. Определите каждое плохое слово как ключ массива. Например,
//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 }
В этом коде мы просто проверяем, существует ли индекс, а не сравниваем плохое слово со всеми словами в списке плохих слов.
isset намного быстрее, чем in_array и немного быстрее, чем array_key_exists.
Убедитесь, что ни одно из значений в массиве плохих слов не установлено в значение null.
isset вернет false, если для индекса массива установлено значение null.
Положите и выйдите или умрите, как только найдете какие-нибудь плохие слова, как это
foreach ($bads as $bad) { if (strpos($string,$bad) !== false) { //say NO! } else { echo YES; die(); or exit; } }
Хотите этого?
$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>'; } }
Я бы пошел таким образом, если строка чата не так долго.
$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!';
$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";
Существует очень короткий сценарий 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;
делает всю работу.
Если вы хотите сделать это с помощью 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; }
Хотя я не знаю php, это кажется простой проблемой программирования. Вы можете просто обозначить строку и использовать такую карту, как структура, которая учитывает появление каждого слова, а затем вы можете просто перекрестно проверить каждое плохое слово на карте. Карта будет иметь слова как ключ и значение, как количество раз, когда слово входит в строку. И тогда вам нужно всего лишь найти карту для каждого плохого слова.