Ответ 1
function contains($str, array $arr)
{
foreach($arr as $a) {
if (stripos($str,$a) !== false) return true;
}
return false;
}
Это для чат-страницы. У меня есть $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
, выход НЕТ! затем ДА! поэтому по какой-то причине код запускает его дважды.
function contains($str, array $arr)
{
foreach($arr as $a) {
if (stripos($str,$a) !== false) return true;
}
return false;
}
1) Самый простой способ:
if ( in_array( 'eleven', array('four', 'eleven', 'six') ))
...
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 скрипт
//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 script, который можно использовать для идентификации плохих слов в строке, которая использует 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, это кажется простой проблемой программирования. Вы можете просто обозначить строку и использовать такую карту, как структура, которая учитывает появление каждого слова, а затем вы можете просто перекрестно проверить каждое плохое слово на карте. Карта будет содержать слова в качестве ключа и значения как количество раз, когда слово входит в строку. И тогда вам нужно всего лишь найти карту для каждого плохого слова.
Вы можете сделать фильтр таким же образом
$string = "This dude is a mothertrucker";
if (preg_match_all('#\b(truck|shot|etc)\b#', $string )) //add all bad words here.
{
echo "There is a bad word in the string";
}
else {
echo "There is no bad word in the string";
}