Как проверить, если строка содержит несколько конкретных слов?
Я могу проверить отдельные слова, используя следующий код:
$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 в противном случае).
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'
которого нет.