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