Проверить, находится ли элемент массива в строке

Этот вопрос о строках уже задавался, однако * ни один из рассмотренных мной вопросов (не моды не удаляют или не сообщают нам, что это дубликат) на самом деле не отвечает на мой вопрос.

У меня есть целевая страница с простой подпиской по электронной почте. В последнее время люди злоупотребляют этим, вводя иностранные символы, такие как *, #, $,%, а также намеренно используют ненормативную лексику (вы всегда можете сказать). У меня есть набор запрещенных символов и слов, которые я использую следующим образом

$banned = array("f**k", "f******", "blah", "*", "#", "$", "%");

Я могу точно сказать, что кто-то снова и снова намеренно пытался пройти через это, потому что я пропустил некоторые символы, и внезапно была введена куча адресов, не имеющих никакого смысла. Мне нужно знать, как использовать цикл For, чтобы пройти и выяснить, содержит ли следующее какое-либо из запрещенных слов в массиве

$email = $_POST['email'];

Я пробовал использовать

$arrlen = count($banned);
for($i=0; $i < $arrlen; $i++) {
    if(stripos($email, $banned[$i] !== false) {
        echo 'Banned word or character!';
    }
    else {
        echo 'Email signed up!';
    }
}

Это вообще не сработало! Я попробовал старую функцию is_str_contain, но ошибка функции не существует.

Я пробовал и обычные strpos, все равно без радости.


person GeordieDave1980    schedule 11.09.2015    source источник
comment
Что означает: Это вообще не сработало? Вы получили: PHP warning: Did not work at all at line 4? Также добавьте отчет об ошибках (ini_set("display_errors", 1); error_reporting(E_ALL);) в начало файла (ов) и проверьте наличие ошибок + Дайте нам реальный пример   -  person Rizier123    schedule 11.09.2015
comment
Примечание: если это предназначено для использования в базе данных и / или в качестве подписки, в идеале вы должны использовать метод подтверждения. Если электронное письмо не подтверждается, не впускайте его. Вот как вы избавляетесь от всякой ерунды ;-)   -  person Funk Forty Niner    schedule 11.09.2015
comment
Просто чтобы добавить это в комментарии, вам не хватает скобки ) в вашем операторе if   -  person Rizier123    schedule 11.09.2015
comment
Извините, я знаю, что только что заметил это, моя проблема, но я просто напечатал это здесь, отсутствие скобок на месте не имело никакого значения. Также Rizier123, не работая, я имею в виду, что он все еще отображал сообщение "Электронная почта подписана!" так что это в значительной степени говорит о том, что это не сработало, я использовал несколько плохих слов и запрещенных персонажей. Тем не менее позволил это пройти.   -  person GeordieDave1980    schedule 11.09.2015
comment
Быстрый 10-секундный поиск на этом самом сайте возвращает несколько потоков, которые уже дают правильные ответы именно на этот вопрос stackoverflow.com/questions/8467036/ stackoverflow.com/questions/13795789/ stackoverflow.com/questions/20930558/ Я бы посоветовал вам попрактиковаться в поиске, чтобы найти ответ.   -  person Dave    schedule 11.09.2015
comment
@ GeordieDave1980 Я не собираюсь набирать очки здесь, но я опубликовал рабочий метод почти за полчаса до этого комментария; не уверен, видели вы это или нет. Плюс, мой, это НЕ редактирование постфактум.   -  person Funk Forty Niner    schedule 11.09.2015


Ответы (5)


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

Следующие работы:

$banned = array("badword1", "badword2", "blah", "*", "#", "$", "%");
$_POST['email'] = "[email protected]";
$email = $_POST['email'];

    foreach ($banned as $ban) {
        if (stripos($email, $ban) !== FALSE) {
            echo "Match found."; 
            return true;
        }
    }
    echo "No match found.";
    return false;

Плюс, как я уже упоминал в комментариях; вам следует использовать метод подтверждения, отправленный по электронной почте, если вы еще этого не сделали. Если этот человек не подтверждает свой адрес электронной почты, то прекратите нажимать кнопку.

person Funk Forty Niner    schedule 11.09.2015
comment
Нет ответа от ОП, поэтому я двигаюсь дальше. прибытьдерчи - person Funk Forty Niner; 11.09.2015

Используя регулярные выражения?

if( !preg_match( '/(\b' . implode( '\b|\b', $banned ) . '\b)/i',
 $_POST['email'] )) {
     echo "Match found"; 
}
person brute_force    schedule 11.09.2015
comment
Вопрос? Или ответ? Почему ОП должен попробовать это? В хорошем ответе всегда будет объяснение того, что было сделано и почему это было сделано именно так, не только для OP, но и для будущих посетителей SO. - person Jay Blanchard; 11.09.2015
comment
Разложите массив и найдите данную строку в строке взорванного массива. Код делает это. - person brute_force; 11.09.2015
comment
Отредактируйте свой пост, чтобы добавить объяснение. - person Jay Blanchard; 11.09.2015

попробуй вот так

$banned = array("****", "*******", "blah", "*", "#", "$", "%");

$email = $_POST['email'];
foreach ($email as $em) {
    //if (strstr($em, $banned)) { // mine version
    if (strpos($em, $banned) !== FALSE) { // Yoshi version
        echo "Match found"; 
        return true;
    }
}
echo "Not found!";
return false;
person Ravinder Kumar    schedule 11.09.2015
comment
Зачем OP пытаться вот так? Что вы изменили и почему? - person Rizier123; 11.09.2015
comment
Похоже, ничего из этого не сработало. Я пробовал каждый из них, но введенный адрес электронной почты был пропущен. - person GeordieDave1980; 11.09.2015

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

foreach ($banned as $v) {
    if (stripos($email,$v) > -1){
        echo 'Banned word or character!';
    }else{
        echo 'Email signed up!';
    }
}
person Narendrasingh Sisodia    schedule 11.09.2015
comment
Это работало только для первого слова в массиве, все остальное после этого, когда вводилось, разрешало его и отображало «Электронная почта подписана!». Кажется, я вообще не могу найти ничего, что работало бы. - person GeordieDave1980; 11.09.2015
comment
Затем удалите этот break из цикла. Я добавил перерыв, чтобы проверить, совпадает ли какое-либо из этих слов, тогда нет необходимости проверять дальнейшие значения. - person Narendrasingh Sisodia; 11.09.2015
comment
К сожалению, это не сработало. По-прежнему ловится только на первом слове в массиве. Серьезно не понимаю, почему ничего не работает. - person GeordieDave1980; 11.09.2015
comment
Оно должно быть if (stripos($email,$v) !== false){...}, потому что, если запрещенное слово находится в начале, stripos возвращает 0 (в качестве позиции), что будет интерпретировано как false. - person TobiasJ; 11.09.2015
comment
Если вы собираетесь скопировать @ Fred-ii-, то, по крайней мере, скопируйте все это правильно, а еще лучше не копируйте - person RiggsFolly; 11.09.2015
comment
Я не копировал ни одного @Fred-ii- ответа @RiggsFolly. Причина, по которой я изменил свой ответ, заключается в том, что он выдаст warning при проверке значения * в пределах preg_match, поэтому еще у меня нет причин заменять свой ответ - person Narendrasingh Sisodia; 11.09.2015
comment
@RiggsFolly Вы проголосовали против моего ответа. Если кажется, что это скопированный код, я удалю свой пост - person Narendrasingh Sisodia; 11.09.2015
comment
@Ushia комментарий был написан, когда ваш код не редактировался. Перестаньте обвинять людей в том, что они написали до того, как вы отредактировали свой ответ. - person TobiasJ; 11.09.2015
comment
@TobiasJ Я никого здесь не виню, если это выглядит резким, я заберу свои слова обратно и прошу прощения за такое поведение - person Narendrasingh Sisodia; 11.09.2015

Вам нужно будет перебрать каждое запрещенное слово и посмотреть, содержит ли ваше электронное письмо какое-либо запрещенное слово / символ.

$banned = array("****", "*******", "blah", "*", "#", "$", "%");
$email = $_POST['email'];
$banned = false;
for($i=0; $i < count($banned); $i++) {
    if(strrpos($email, $banned[$i]) != FALSE ) {
       $banned = true;
       break;
    }
}
echo $banned ? 'Banned word or character!' : 'Email signed up!'
person Imab Asghar    schedule 11.09.2015
comment
Почему ОП должен попробовать это? В хорошем ответе всегда будет объяснение того, что было сделано и почему это было сделано именно так, не только для OP, но и для будущих посетителей SO. - person Jay Blanchard; 11.09.2015