Всем привет! Подскажите регулярку для проверки наличия двух слов в строке, т.е. эти два слова должны быть обязательно в строке и неважно в каком порядке или месте. Слова: car, red Код (Text): $str="My car is black"; //false $str="My car is red"; //true $str="My red car"; //true $str="My house is red"; //false Помогите решить задачу... Спасибо!
Код (PHP): echo preg_match('/(car.*red)|(red.*car)/',$str); Есть условие, что должны быть целые слова? А то "carrrrrred" тоже будет true. Вспомнил, вот так будет лучше Код (PHP): echo preg_match('/((\b)car(\b).*(\b)red(\b))|((\b)red(\b).*(\b)car(\b))/',$str);
Код (PHP): $ws = [ 'car', 'red', 'fast', ]; $ss = [ 'the blue car is slow', 'that car is fast', 'the red car', 'but red car is not so red', ]; foreach ($ss as $ks => $s) { foreach ($ws as $kw => $w) { $r[$ks][$kw] = (bool)strpos($s, $w); } } var_dump($r); Код (Text): array (size=4) 0 => array (size=3) 0 => boolean true 1 => boolean false 2 => boolean false 1 => array (size=3) 0 => boolean true 1 => boolean false 2 => boolean true 2 => array (size=3) 0 => boolean true 1 => boolean true 2 => boolean false 3 => array (size=3) 0 => boolean true 1 => boolean true 2 => boolean false Код (PHP): $ws = [ 'car', 'red', 'fast', ]; $ss = [ 'the blue car is slow', 'that car is fast', 'the red car', 'but red car is not so red', ]; $wz = array_combine(array_keys($ws), array_fill(0, count($ws), false)); $r = array_combine(array_keys($ss), array_fill(0, count($ss), $wz)); foreach ($ss as $ks => $s) { foreach ($ws as $kw => $w) { $c = substr_count($s, $w); $r[$ks][$kw] = $c; } } var_dump($r); Код (Text): array (size=4) 0 => array (size=3) 0 => int 1 1 => int 0 2 => int 0 1 => array (size=3) 0 => int 1 1 => int 0 2 => int 1 2 => array (size=3) 0 => int 1 1 => int 1 2 => int 0 3 => array (size=3) 0 => int 1 1 => int 2 2 => int 0
Спасибо всем за помощь! Подошел этот вариант решения: Код (Text): preg_match('/(car.*red)|(red.*car)/',$str);
Так человеку подошел вариант, и ладно. А на слова бить я тоже предлагал Код (PHP): echo preg_match('/((\b)car(\b).*(\b)red(\b))|((\b)red(\b).*(\b)car(\b))/',$str); Ну и модификатор i поставить после /
Функция для поиска по одному или нескольким словам PHP: function search_in_catalog ( $param1 = "" ) { // Слова для поиска $needle = $param1; $needle = trim ($needle); $needle = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-\s\_\,]/ui", "", $needle); $needle = preg_replace ("/\,+/", "", $needle); $needle = preg_replace ("/ +/", " ", $needle); $search_words = explode(" ", $needle); $search_words_new = array (); foreach ( $search_words as $k1 => $v1 ) { $word = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-]/ui", "", $v1); if ( mb_strlen ($word, "UTF-8") != 1 and $word != "" ) { $search_words_new[] = $word; } } unset ($k1, $v1, $k2, $v2, $k3, $v3, $word); $search_result = array (); if ( count ($search_words_new) > 0 ) { // Массив для поиска $product_array = array ( // Массив продуктов 1 => "Аккордеоны, Баяны", 2 => "Аксессуары", 3 => "Арфы и аксессуары", 4 => "Генераторы эффектов", 5 => "Гитарные аксессуары", ); // Поиск по нескольким словам ——————————————————— if ( count ($search_words_new) > 1 ) { foreach ( $product_array as $k1 => $v1 ) { // $res_2 foreach ( $search_words_new as $k2 => $v2 ) { $res_1[$k1][$k2] = (bool) strpos ($v1, $v2); } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_1 as $k1 => $v1 ) { foreach ( $v1 as $k2 => $v2 ) { $res_2[$k1][$k2] = (int)$v2; } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_2 as $k1 => $v1 ) { $count = 0; foreach ( $v1 as $k2 => $v2 ) { if ( $v2 != 0 ) { $count = $count + $v2; } if ( $count > 1 ) { $search_result[$k1] = $count; } } } unset ($k1, $v1, $k2, $v2, $k3, $v3); } // Поиск по одному слову ——————————————————— if ( count ($search_words_new) < 2 ) { foreach ( $product_array as $k1 => $v1 ) { // $res_2 foreach ( $search_words_new as $k2 => $v2 ) { $res_1[$k1][$k2] = (bool) strpos ($v1, $v2); } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_1 as $k1 => $v1 ) { foreach ( $v1 as $k2 => $v2 ) { $res_2[$k1][$k2] = (int)$v2; } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_2 as $k1 => $v1 ) { $count = 0; foreach ( $v1 as $k2 => $v2 ) { if ( $v2 != 0 ) { $count = $count + $v2; } if ( $count > 0 ) { $search_result[$k1] = $count; } } } unset ($k1, $v1, $k2, $v2, $k3, $v3); } } return $search_result; }
В функции выше есть небольшая ошибочка, а именно функцию strpos надо заменить на stripos для того чтобы поиск был регистронезависимым PHP: function search_in_catalog ( $query = "" ) { // Слова для поиска $needle = $query; $needle = trim ($needle); $needle = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-\s\_\,]/ui", "", $needle); $needle = preg_replace ("/\,+/", "", $needle); $needle = preg_replace ("/ +/", " ", $needle); $search_words = explode(" ", $needle); $search_words_new = array (); foreach ( $search_words as $k1 => $v1 ) { $word = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-]/ui", "", $v1); if ( mb_strlen ($word, "UTF-8") != 1 and $word != "" ) { $search_words_new[] = $word; } } unset ($k1, $v1, $k2, $v2, $k3, $v3, $word); $search_result = array (); if ( count ($search_words_new) > 0 ) { // Массив для поиска $product_array = array ( // Массив продуктов 1 => "Аккордеоны, Баяны", 2 => "Аксессуары", 3 => "Арфы и аксессуары", 4 => "Генераторы эффектов", 5 => "Гитарные аксессуары", ); // Поиск по нескольким словам ——————————————————— if ( count ($search_words_new) > 1 ) { foreach ( $product_array as $k1 => $v1 ) { // $res_2 foreach ( $search_words_new as $k2 => $v2 ) { $res_1[$k1][$k2] = (bool) stripos ($v1, $v2); } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_1 as $k1 => $v1 ) { foreach ( $v1 as $k2 => $v2 ) { $res_2[$k1][$k2] = (int)$v2; } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_2 as $k1 => $v1 ) { $count = 0; foreach ( $v1 as $k2 => $v2 ) { if ( $v2 != 0 ) { $count = $count + $v2; } if ( $count > 1 ) { $search_result[$k1] = $count; } } } unset ($k1, $v1, $k2, $v2, $k3, $v3); } // Поиск по одному слову ——————————————————— if ( count ($search_words_new) < 2 ) { foreach ( $product_array as $k1 => $v1 ) { // $res_2 foreach ( $search_words_new as $k2 => $v2 ) { $res_1[$k1][$k2] = (bool) stripos ($v1, $v2); } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_1 as $k1 => $v1 ) { foreach ( $v1 as $k2 => $v2 ) { $res_2[$k1][$k2] = (int)$v2; } } unset ($k1, $v1, $k2, $v2, $k3, $v3); foreach ( $res_2 as $k1 => $v1 ) { $count = 0; foreach ( $v1 as $k2 => $v2 ) { if ( $v2 != 0 ) { $count = $count + $v2; } if ( $count > 0 ) { $search_result[$k1] = $count; } } } unset ($k1, $v1, $k2, $v2, $k3, $v3); } } return $search_result; }