Php проверяет, содержит ли строка несколько слов

Я искал в Интернете что-то, что будет делать это, но это будет работать только с одним словом.

Я пытаюсь создать скрипт, который обнаружит неправильное имя пользователя для моего сайта, неправильное имя пользователя будет обнаружено, если имя пользователя содержит любое из слов в массиве.

Вот код, который я сделал, но не сработал.

$bad_words = array("yo","hi");
$sentence = "yo";

if (strpos($bad_words,$sentence)==false) {
echo "success";
}

Если бы кто-нибудь мог мне помочь, я был бы признателен.


person Frank    schedule 09.05.2012    source источник
comment
Возможный дубликат: stackoverflow.com/q/1916261/259457   -  person Travesty3    schedule 09.05.2012
comment
Как насчет того, когда кого-то зовут Янгс?   -  person Sampson    schedule 09.05.2012
comment
Не используйте ==, так как (0 == false) вернет true. Если функция возвращает несколько типов, используйте strict (===, !==)   -  person Cole Johnson    schedule 09.05.2012
comment
Затем это будет превращено в фильтр плохих слов.   -  person Frank    schedule 09.05.2012
comment
@frank Могут ли имена пользователей содержать пробелы или другие небуквенно-цифровые символы? И вас беспокоят такие строки, как yö, которые не отображаются в вашем фильтре?   -  person Sampson    schedule 09.05.2012
comment
Я хочу рассказать об основах, например, если кто-то сделает имя пользователя pon, тогда мой сайт будет mysite.com/pon. Это будет хорошо выглядеть в поисковых системах -_-   -  person Frank    schedule 09.05.2012
comment
@Frank Если кто-то сделает свое имя pr0n, будет ли это выглядеть лучше? Я не уверен, что проблема, которую вы описываете, решается фильтром.   -  person Sampson    schedule 09.05.2012


Ответы (8)


использовать

substr_count

для массива используйте следующую функцию

function substr_count_array( $haystack, $needle ) {
     $count = 0;
     foreach ($needle as $substring) {
          $count += substr_count( $haystack, $substring);
     }
     return $count;
}
person Oliver M Grech    schedule 09.05.2012
comment
Почему? Для этого есть функция: str_word_count - person Marcelo Rodovalho; 18.11.2019
comment
@MarceloRodovalho str_word_count не имеет ничего общего с тем, что спросил оператор. str_word_count возвращает количество слов в строке. substr_count возвращает количество раз, когда слово ($needle) встречается в строке. И моя функция substr_count_array делает то же самое, используя массив $needle(s) - person Oliver M Grech; 19.11.2019

Вы можете использовать этот код:

$bad_words = array("yo","hi");
$sentence = "yo you your";
// break your sentence into words first
preg_match_all('/\w+/', $sentence, $m);
echo ( array_diff ( $m[0], $bad_words ) === $m[0] ) ? "no bad words found\n" :
                                                      "bad words found\n";
person anubhava    schedule 09.05.2012

Я считаю, что предложение состоит из нескольких слов

Пытаться

$badwords = array("yo","hi");
$string  = "i am yo this is testing";
$word = array_intersect( $badwords,explode(" " , $string));
if(empty($word))
{
    echo "Sucess" ;
}
person Baba    schedule 09.05.2012

<?php
function isUserNameCorrect()
{
    Foreach($badname in $badnames)
    {
        if(strstr($badname, $enteredname) == false)
        {
             return false;
        }
    }
    return true;
}

Может это поможет

person Willem T    schedule 09.05.2012
comment
Решение не подходит для следующей проблемы: плохое слово «дурак» не будет обнаружено, если пользователь введет «ifoolyou!» (вам также нужно подумать о частичных совпадениях. - person Charles Forest; 09.05.2012

К сожалению, вы не можете напрямую передать Array функциям strpos/strstr.

Согласно комментариям PHP.net, для этого вам нужно использовать (или создать свою собственную, если хотите) такую ​​функцию:

function strstr_array($haystack, $needle) 
{
     if ( !is_array( $haystack ) ) {
         return false;
     }
     foreach ( $haystack as $element ) {
         if ( stristr( $element, $needle ) ) {
             return $element;
         }
     }
}

Затем просто измените strpos на новую функцию — strstr_array:

$bad_words = array("yo","hi");
$sentence = "yo";

if (strstr_array($bad_words,$sentence)==false) {
     echo "success";
}
person Karo    schedule 09.05.2012

Я бы реализовал это следующим образом:

$bad_words = array("yo","hi");
$sentence = "yo";

$valid = true;
foreach ($bad_words as $bad_word) {
    if (strpos($sentence, $bad_word) !== false) {
        $valid = false;
        break;
    }
}

if ($valid) {
    echo "success";
}

Предложение считается действительным, если оно не содержит хотя бы одно слово из $bad_words. Обратите внимание на строгую проверку (т.е. !==), без этого проверка завершится ошибкой, когда результат strpos равен 0 вместо false.

person TaZ    schedule 09.05.2012

Вы близко. Вы можете сделать это следующим образом:

$bad_words = array("yo","hi");
$sentence = "yo";
$match = false;
foreach($bad_words as $bad_word) {
  if (strpos($bad_word,$sentence) === false) {  # use $bad_word, not $bad_words
    $match = true;
    break;
  }
}
if($match) { echo "success"; }
person GSto    schedule 09.05.2012
comment
не должно ли быть if (strpos($bad_word,$sentence) !== false) { $match = true; ломать; } - person Liam; 29.08.2015

person    schedule
comment
функция stringTester() не найдена? - person Oliver M Grech; 07.03.2013