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

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

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

$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)

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

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

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

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

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

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

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

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

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

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

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

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

обычные выражения

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

( preg_match return 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 .

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

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

Вышеприведенное не совсем корректно.

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

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

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

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

 'bad || naughty' 

которого нет.