За последние 24 часа нас посетил 8171 программист и 1005 роботов. Сейчас ищут 265 программистов ...

Регулярка для проверки наличия двух слов в строке

Тема в разделе "Регулярные выражения", создана пользователем Bueno, 19 сен 2013.

  1. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Всем привет!

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

    Слова: car, red

    Код (Text):
    1. $str="My car is black"; //false
    2. $str="My car is red"; //true
    3. $str="My red car"; //true
    4. $str="My house is red"; //false
    Помогите решить задачу...

    Спасибо!
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.764
    Именно регулярку?
     
  3. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Хотелось бы регуляркой. Какие могут быть еще варианты?
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (PHP):
    1. echo preg_match('/(car.*red)|(red.*car)/',$str); 
    Есть условие, что должны быть целые слова? А то "carrrrrred" тоже будет true.

    Вспомнил, вот так будет лучше
    Код (PHP):
    1. echo preg_match('/((\b)car(\b).*(\b)red(\b))|((\b)red(\b).*(\b)car(\b))/',$str); 
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.399
    Симпатии:
    1.245
    Адрес:
    Лень
    Код (PHP):
    1. if (preg_match('/(car|red)/i', $str) == 1) {
    2. echo 'Yes';
    3. } else {
    4. echo 'no';
    5. }
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    искать через strpos() будет быстрее. если задача просто в факте содержания этих слов
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.764
    Код (PHP):
    1. $ws = [
    2.     'car',
    3.     'red',
    4.     'fast',
    5. ];
    6. $ss = [
    7.     'the blue car is slow',
    8.     'that car is fast',
    9.     'the red car',
    10.     'but red car is not so red',
    11. ];
    12. foreach ($ss as $ks => $s) {
    13.   foreach ($ws as $kw => $w) {
    14.     $r[$ks][$kw] = (bool)strpos($s, $w);
    15.   }
    16. }
    17.  
    18. var_dump($r); 
    Код (Text):
    1. array (size=4)
    2.   0 =>
    3.     array (size=3)
    4.       0 => boolean true
    5.       1 => boolean false
    6.       2 => boolean false
    7.   1 =>
    8.     array (size=3)
    9.       0 => boolean true
    10.       1 => boolean false
    11.       2 => boolean true
    12.   2 =>
    13.     array (size=3)
    14.       0 => boolean true
    15.       1 => boolean true
    16.       2 => boolean false
    17.   3 =>
    18.     array (size=3)
    19.       0 => boolean true
    20.       1 => boolean true
    21.       2 => boolean false
    Код (PHP):
    1. $ws = [
    2.     'car',
    3.     'red',
    4.     'fast',
    5. ];
    6. $ss = [
    7.     'the blue car is slow',
    8.     'that car is fast',
    9.     'the red car',
    10.     'but red car is not so red',
    11. ];
    12. $wz = array_combine(array_keys($ws), array_fill(0, count($ws), false));
    13. $r = array_combine(array_keys($ss), array_fill(0, count($ss), $wz));
    14.  
    15. foreach ($ss as $ks => $s) {
    16.   foreach ($ws as $kw => $w) {
    17.     $c = substr_count($s, $w);
    18.     $r[$ks][$kw] = $c;
    19.   }
    20. }
    21.  
    22. var_dump($r); 
    Код (Text):
    1. array (size=4)
    2.   0 =>
    3.     array (size=3)
    4.       0 => int 1
    5.       1 => int 0
    6.       2 => int 0
    7.   1 =>
    8.     array (size=3)
    9.       0 => int 1
    10.       1 => int 0
    11.       2 => int 1
    12.   2 =>
    13.     array (size=3)
    14.       0 => int 1
    15.       1 => int 1
    16.       2 => int 0
    17.   3 =>
    18.     array (size=3)
    19.       0 => int 1
    20.       1 => int 2
    21.       2 => int 0
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.167
    Симпатии:
    65
    Я не спорю что регулярка медленнее, но когда строка не большая разве разница будет заметна?
     
  9. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Спасибо всем за помощь!

    Подошел этот вариант решения:
    Код (Text):
    1. preg_match('/(car.*red)|(red.*car)/',$str);
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.415
    Симпатии:
    1.764
    Я в печали =(
    мы забыли про случаи типа
    надо бить на слова, или юзать \W в регулярке или типа того.
     
  11. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Так человеку подошел вариант, и ладно.
    А на слова бить я тоже предлагал
    Код (PHP):
    1. echo preg_match('/((\b)car(\b).*(\b)red(\b))|((\b)red(\b).*(\b)car(\b))/',$str); 
    Ну и модификатор i поставить после /
     
  12. maxmusic

    maxmusic Новичок

    С нами с:
    19 апр 2021
    Сообщения:
    2
    Симпатии:
    0
    Функция для поиска по одному или нескольким словам

    PHP:
    1. function search_in_catalog ( $param1 = "" ) {
    2.     // Слова для поиска
    3.     $needle = $param1;
    4.     $needle = trim ($needle);
    5.     $needle = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-\s\_\,]/ui", "", $needle);
    6.     $needle = preg_replace ("/\,+/", "", $needle);
    7.     $needle = preg_replace ("/ +/", " ", $needle);
    8.     $search_words = explode(" ", $needle);
    9.  
    10.     $search_words_new = array ();
    11.     foreach ( $search_words as $k1 => $v1 ) {
    12.         $word = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-]/ui", "", $v1);
    13.         if ( mb_strlen ($word, "UTF-8") != 1 and $word != "" ) {
    14.             $search_words_new[] = $word;
    15.         }
    16.     }
    17.     unset ($k1, $v1, $k2, $v2, $k3, $v3, $word);
    18.  
    19.     $search_result = array ();
    20.     if ( count ($search_words_new) > 0 ) {
    21.         // Массив для поиска
    22.         $product_array = array ( // Массив продуктов
    23.             1 => "Аккордеоны, Баяны",
    24.             2 => "Аксессуары",
    25.             3 => "Арфы и аксессуары",
    26.             4 => "Генераторы эффектов",
    27.             5 => "Гитарные аксессуары",
    28.         );
    29.      
    30.         // Поиск по нескольким словам ———————————————————
    31.         if ( count ($search_words_new) > 1 ) {
    32.             foreach ( $product_array as $k1 => $v1 ) { // $res_2
    33.                 foreach ( $search_words_new as $k2 => $v2 ) {
    34.                     $res_1[$k1][$k2] = (bool) strpos ($v1, $v2);
    35.                 }
    36.             }
    37.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    38.  
    39.             foreach ( $res_1 as $k1 => $v1 ) {
    40.                 foreach ( $v1 as $k2 => $v2 ) {
    41.                     $res_2[$k1][$k2] = (int)$v2;
    42.                 }
    43.             }
    44.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    45.  
    46.             foreach ( $res_2 as $k1 => $v1 ) {
    47.                 $count = 0;
    48.                 foreach ( $v1 as $k2 => $v2 ) {
    49.                     if ( $v2 != 0 ) {
    50.                         $count = $count + $v2;
    51.                     }
    52.                     if ( $count > 1 ) {
    53.                         $search_result[$k1] = $count;
    54.                     }
    55.                 }
    56.             }
    57.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    58.         }
    59.         // Поиск по одному слову ———————————————————
    60.         if ( count ($search_words_new) < 2 ) {
    61.             foreach ( $product_array as $k1 => $v1 ) { // $res_2
    62.                 foreach ( $search_words_new as $k2 => $v2 ) {
    63.                     $res_1[$k1][$k2] = (bool) strpos ($v1, $v2);
    64.                 }
    65.             }
    66.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    67.  
    68.             foreach ( $res_1 as $k1 => $v1 ) {
    69.                 foreach ( $v1 as $k2 => $v2 ) {
    70.                     $res_2[$k1][$k2] = (int)$v2;
    71.                 }
    72.             }
    73.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    74.  
    75.             foreach ( $res_2 as $k1 => $v1 ) {
    76.                 $count = 0;
    77.                 foreach ( $v1 as $k2 => $v2 ) {
    78.                     if ( $v2 != 0 ) {
    79.                         $count = $count + $v2;
    80.                     }
    81.                     if ( $count > 0 ) {
    82.                         $search_result[$k1] = $count;
    83.                     }
    84.                 }
    85.             }
    86.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    87.         }
    88.     }
    89.  
    90.     return $search_result;
    91. }
     
    #12 maxmusic, 19 апр 2021
    Последнее редактирование: 19 апр 2021
  13. maxmusic

    maxmusic Новичок

    С нами с:
    19 апр 2021
    Сообщения:
    2
    Симпатии:
    0
    В функции выше есть небольшая ошибочка, а именно функцию strpos надо заменить на stripos для того чтобы поиск был регистронезависимым

    PHP:
    1. function search_in_catalog ( $query = "" ) {
    2.     // Слова для поиска
    3.     $needle = $query;
    4.     $needle = trim ($needle);
    5.     $needle = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-\s\_\,]/ui", "", $needle);
    6.     $needle = preg_replace ("/\,+/", "", $needle);
    7.     $needle = preg_replace ("/ +/", " ", $needle);
    8.     $search_words = explode(" ", $needle);
    9.     $search_words_new = array ();
    10.     foreach ( $search_words as $k1 => $v1 ) {
    11.         $word = preg_replace ("/[^а-яА-ЯёЁйЙa-zA-Z0-9\-]/ui", "", $v1);
    12.         if ( mb_strlen ($word, "UTF-8") != 1 and $word != "" ) {
    13.             $search_words_new[] = $word;
    14.         }
    15.     }
    16.     unset ($k1, $v1, $k2, $v2, $k3, $v3, $word);
    17.     $search_result = array ();
    18.     if ( count ($search_words_new) > 0 ) {
    19.         // Массив для поиска
    20.         $product_array = array ( // Массив продуктов
    21.             1 => "Аккордеоны, Баяны",
    22.             2 => "Аксессуары",
    23.             3 => "Арфы и аксессуары",
    24.             4 => "Генераторы эффектов",
    25.             5 => "Гитарные аксессуары",
    26.         );
    27.    
    28.         // Поиск по нескольким словам ———————————————————
    29.         if ( count ($search_words_new) > 1 ) {
    30.             foreach ( $product_array as $k1 => $v1 ) { // $res_2
    31.                 foreach ( $search_words_new as $k2 => $v2 ) {
    32.                     $res_1[$k1][$k2] = (bool) stripos ($v1, $v2);
    33.                 }
    34.             }
    35.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    36.             foreach ( $res_1 as $k1 => $v1 ) {
    37.                 foreach ( $v1 as $k2 => $v2 ) {
    38.                     $res_2[$k1][$k2] = (int)$v2;
    39.                 }
    40.             }
    41.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    42.             foreach ( $res_2 as $k1 => $v1 ) {
    43.                 $count = 0;
    44.                 foreach ( $v1 as $k2 => $v2 ) {
    45.                     if ( $v2 != 0 ) {
    46.                         $count = $count + $v2;
    47.                     }
    48.                     if ( $count > 1 ) {
    49.                         $search_result[$k1] = $count;
    50.                     }
    51.                 }
    52.             }
    53.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    54.         }
    55.         // Поиск по одному слову ———————————————————
    56.         if ( count ($search_words_new) < 2 ) {
    57.             foreach ( $product_array as $k1 => $v1 ) { // $res_2
    58.                 foreach ( $search_words_new as $k2 => $v2 ) {
    59.                     $res_1[$k1][$k2] = (bool) stripos ($v1, $v2);
    60.                 }
    61.             }
    62.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    63.             foreach ( $res_1 as $k1 => $v1 ) {
    64.                 foreach ( $v1 as $k2 => $v2 ) {
    65.                     $res_2[$k1][$k2] = (int)$v2;
    66.                 }
    67.             }
    68.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    69.             foreach ( $res_2 as $k1 => $v1 ) {
    70.                 $count = 0;
    71.                 foreach ( $v1 as $k2 => $v2 ) {
    72.                     if ( $v2 != 0 ) {
    73.                         $count = $count + $v2;
    74.                     }
    75.                     if ( $count > 0 ) {
    76.                         $search_result[$k1] = $count;
    77.                     }
    78.                 }
    79.             }
    80.             unset ($k1, $v1, $k2, $v2, $k3, $v3);
    81.         }
    82.     }
    83.     return $search_result;
    84. }