Подтвердить что ты не робот

Проверьте, содержит ли строка несколько конкретных слов

Как проверить, если строка содержит несколько конкретных слов?

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

$data = "text text text text text text text bad text text naughty";
if (strpos($data, 'bad') !== false) {
    echo 'true';
}

Но я хочу добавить еще несколько слов для проверки. Что-то вроде этого:

$data = "text text text text text text text bad text text naughty";
if (strpos($data, 'bad || naughty') !== false) {
    echo 'true';
}
?>

(если любое из этих слов найдено, то оно должно возвращать true)

Но выше код работает неправильно. Любая идея, что я делаю неправильно?

4b9b3361

Ответ 1

Для этого вам понадобится Регулярные выражения и preg_match.

Что-то вроде:

if(preg_match('(bad|naughty)', $data) === 1) { } 

Причина, по которой ваша попытка не срабатывала

Регулярные выражения анализируются механизмом регулярных выражений PHP. Проблема с вашим синтаксисом заключается в том, что вы использовали оператор ||. Это не оператор регулярных выражений, поэтому он считается частью строки.

Как правильно указано выше, если он считается частью строки, которую вы хотите сопоставить: 'bad || naughty' как строка, а не выражение!

Ответ 2

Вы не можете сделать что-то вроде этого:

if (strpos($data, 'bad || naughty') !== false) {

вместо этого вы можете использовать регулярное выражение:

if(preg_match("/(bad|naughty|other)/i", $data)){
 //one of these string found
}

Ответ 3

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

регулярные выражения

if(preg_match("/\b(bad|naughty)\b/", $data)){
    echo "Found";
}

(preg_match возвращает 1, если в строке есть совпадение, 0 в противном случае).

несколько вызовов str_pos

if (strpos($data, 'bad')!==false or strpos($data, 'naughty')!== false) {
    echo "Found";
}

взрываются

if (count(array_intersect(explode(' ', $data),array('bad','naugthy')))) {
    echo "Found";
}

Предпочтительным решением для меня должно быть первое. Это понятно, возможно, не так эффективно из-за использования регулярных выражений, но не сообщает ложных срабатываний и, например, не будет вызывать эхо, если строка содержит слово badmington

Регулярное выражение может стать бременем для создания, если у него много слов (ничего, что вы не можете решить с помощью строки php, хотя $regex = '/\b('.join('|', $badWords).')\b/';

Второй - прямой, но не может отличить плохо от badmington.

Третий разделит строку на слова, если они разделены пробелом, вкладка char разрушит ваши результаты.

Ответ 4

if(preg_match('[bad|naughty]', $data) === true) { }

Вышеуказанное не совсем правильно.

"preg_match() возвращает 1, если шаблон соответствует заданному объекту, 0, если это не так, или FALSE, если произошла ошибка."

Итак, это должно быть просто:

if(preg_match('[bad|naughty]', $data)) { }

Ответ 5

У вас есть strpos каждое слово. Теперь вы проверяете, есть ли строка, которая указывает

'bad || naughty'

который не существует.

Ответ 6

substr_count()

Я хочу добавить еще один способ сделать это с substr_count() (выше всех остальных ответов):

if (substr_count($data, 'bad') || substr_count($data, 'naughty')){
    echo "Found";
}

substr_count() считает, сколько раз строка появляется, поэтому, когда она равна 0, вы знаете, что она не была найдена. Я бы сказал, что этот способ более читабелен, чем использование str_pos() (о котором говорилось в одном из ответов):

if (strpos($data, 'bad')!==false || strpos($data, 'naughty')!== false) {
    echo "Found";
}