За последние 24 часа нас посетили 42463 программиста и 1816 роботов. Сейчас ищут 832 программиста ...

Подсветка результатов поиска на сайте

Тема в разделе "PHP для новичков", создана пользователем Drobotko Taras, 24 май 2017.

  1. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Добрый день. Создал поиск на своем блоге. Поиск работает, но подсветка результатов поиска создать не удается. Ниже привожу выдержку кода с файла search.php. Вопрос: можно ли, опираясь на нижеследующий код, добавить код, который отвечает за подсветку результатов поиска? Если да, то как это можно реализовать? Буду благодарен за доступное и понятное объяснение!
    PHP:
    1.  <?php
    2.              require_once ('connectvars.php');
    3.                  $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    4.              
    5.   // This function builds a search query from the search keywords and sort setting
    6.                
    7.   function build_query($user_search) {
    8.     $search_query = "SELECT count(`id`)  FROM `Blog_articles`" ;
    9.  
    10.     // Extract the search keywords into an array
    11.     $clean_search = str_replace(',', ' ', $user_search);
    12.     $search_words = explode(' ', $clean_search);
    13.     $final_search_words = array();
    14.     if (count($search_words) > 0) {
    15.       foreach ($search_words as $word) {
    16.         if (!empty($word)) {
    17.           $final_search_words[] = $word;
    18.         }
    19.       }
    20.     }
    21.  
    22.     // Generate a WHERE clause using all of the search keywords
    23.     $where_list = array();
    24.     if (count($final_search_words) > 0) {
    25.       foreach($final_search_words as $word) {
    26.         $where_list[] = "text_introduction LIKE '%$word%'";
    27.       }
    28.     }
    29.     $where_clause = implode(' OR ', $where_list);
    30.  
    31.     // Add the keyword WHERE clause to the search query
    32.     if (!empty($where_clause)) {
    33.       $search_query .= " WHERE $where_clause ";
    34.     }
    35.     return $search_query;
    36.   }
    37.   function build_query1($user_search) {
    38.     $search_query1 = "SELECT Ba.title, Ba.date, Ba.rubric_id,
    39.  Ba.text_introduction, Ba.link,
    40.  Rubrics.rubric, Rubrics.translit_rubric
    41.      FROM Blog_articles AS Ba
    42.       INNER JOIN Rubrics USING (rubric_id)" ;
    43.  
    44.     // Extract the search keywords into an array
    45.     $clean_search = str_replace(',', ' ', $user_search);
    46.     $search_words = explode(' ', $clean_search);
    47.     $final_search_words = array();
    48.     if (count($search_words) > 0) {
    49.       foreach ($search_words as $word) {
    50.         if (!empty($word)) {
    51.           $final_search_words[] = $word;
    52.         }
    53.       }
    54.     }
    55.  
    56.     // Generate a WHERE clause using all of the search keywords
    57.     $where_list = array();
    58.     if (count($final_search_words) > 0) {
    59.       foreach($final_search_words as $word) {
    60.         $where_list[] = "Ba.text_introduction OR Ba.title LIKE '%$word%'";
    61.       }
    62.     }
    63.     $where_clause = implode(' OR ', $where_list);
    64.  
    65.     // Add the keyword WHERE clause to the search query
    66.     if (!empty($where_clause)) {
    67.       $search_query1 .= " WHERE $where_clause ";
    68.       $search_query1 .= " ORDER BY Ba.title DESC LIMIT ";
    69.     }
    70.     return $search_query1;
    71.   }
    72.  
    73.   $user_search = $_GET['usersearch'];
    74.   //екранируем спецсимволы
    75.   $user_search_ecran = quotemeta ($user_search);
    76.   // Создаем строку для регулярного выражения
    77. $pattern = "/((?:^|>)[^<]*)(".$user_search_ecran.")/si";
    78. // Подсвеченная строка
    79. $replace = '$1<b style="background:#FFFF00;">$2</b>';
    80. // Заменяем
    81. $html = preg_replace($pattern, $replace, $html);
    82. $page = intval($_GET[page]); // значение текущей страницы из GET
    83. $num = 4; // Переменная хранит число сообщений выводимых на станице
    84. if ($page==0) $page=1;
    85.   // Query to get the total results
    86.   $query = build_query($user_search);
    87. $mysqli_result = mysqli_query($dbc, $query);
    88.  
    89. if(mysqli_num_rows($mysqli_result)>0){
    90.     $count=mysqli_fetch_row($mysqli_result);
    91.     }
    92. $posts = $count[0]; // получем значение кол-во всех записей
    93. // Находим общее число страниц
    94. $total = intval(($posts - 1) / $num) + 1;
    95. // Определяем начало сообщений для текущей страницы
    96. $page = intval($page);
    97. // Если значение $page меньше единицы или отрицательно
    98. // переходим на первую страницу
    99. // А если слишком большое, то переходим на последнюю
    100. if(empty($page) or $page < 0) $page = 1;
    101. if($page > $total) $page = $total;
    102. // Вычисляем начиная c какого номера
    103. // следует выводить сообщения
    104. $start = $page * $num - $num;
    105.  
    106. // Проверяем нужны ли стрелки назад
    107. if ($page != 1) $pervpage = '<a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page=-1">Початок</a>
    108. <a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page='. ($page - 1).'"><</a> ';
    109. // Проверяем нужны ли стрелки вперед
    110. if ($page != $total) $nextpage = '  <a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search . '&page='. ($page + 1).'">></a>
    111. <a href="' .$_SERVER['PHP_SELF'].'?usersearch=' . $user_search . '&page='.$total.'">Кінець</a> ';
    112. // Находим две ближайшие станицы с обоих краев, если они есть
    113. if($page - 2 > 0) $page2left = ' <a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page='. ($page - 2) .'">'. ($page - 2) .'</a>  ';
    114. if($page - 1 > 0) $page1left = '<a href="'.$_SERVER['PHP_SELF']. '?usersearch=' . $user_search .'&page='. ($page - 1) .'">'. ($page - 1) .'</a>  ';
    115. if($page + 2 <= $total) $page2right = '  <a href="'.$_SERVER['PHP_SELF']. '?usersearch=' . $user_search .'&page='. ($page + 2).'">'. ($page + 2) .'</a>';
    116. if($page + 1 <= $total) $page1right = '  <a href="'.$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page='. ($page + 1).'">'. ($page + 1) .'</a>';
    117.  
    118. //получаем записи из БД (начиная с $start, кол-во записей = $num)
    119.  
    120. $query = build_query1($user_search);
    121. $query .= "$start, $num";
    122.     $mysqli_result = mysqli_query($dbc, $query);
    123.   if(mysqli_num_rows($mysqli_result)) {
    124. while ($row = mysqli_fetch_assoc($mysqli_result))
    125. {
    126.   ?>
    127.   <div class="article">
    128.   <?php echo '<h3>' . '<a href="/' . $row['translit_rubric'] . '/' . $row['link'] . '">' . $row['title'] . '</a></h3>'; ?>
    129.                         <div class="info">
    130.                                     <div class="info-in">
    131.    <?php echo '<p> Рубрика: <a href="/' . $row['translit_rubric'] . '/'  . $row['translit_rubric'] . '_index.php"> ' .  $row['rubric'] . '</a> &nbsp;|&nbsp;' .
    132.        'Автор <a href=' . "'../Avtor.php'>Дроботько Тарас</a> | " . substr($row['date'], 0, -3) . '</p>';
    133. ?>                      
    134.                                     </div>
    135.               </div>
    136.                               <p class="indent"></p>
    137.      <p class="indent"> <?php echo $row['text_introduction'] ?></p>
    138.         <p class="continue">[<a href=" <?php echo '/' . $row['translit_rubric'] . '/' . $row['link'] ?>">Читати далі&hellip;</a>]</p>
    139.   </div>
    140. <?php
    141. }
    142.   }
    143.   else { echo '<p class="text-info" style=" font-weight: bolder;">На ваш запит, на жаль, нічого не знайдено.</p>';
    144.           echo '<img src="img/Poshuk.jpg" class="img-responsive center-block"  title="Пошук" alt="Пошук">';
    145.   }
    146. // если страниц больше чем одна
    147. if ($total>1) echo '<p><div align="center" class="navigation">'
    148. .$pervpage.$page2left.$page1left.'<span>'.$page.'</span>'.$page1right.$page2right
    149. .$nextpage.'</div></p>';
    150.  
    151.  
    152.   mysqli_close($dbc);
    153. ?>
     
    #1 Drobotko Taras, 24 май 2017
    Последнее редактирование: 24 май 2017
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Форум русскоязычный. При всём уважении к украинскому языку, переведи, чего тебе нужно
    --- Добавлено ---
    В том варианте, что ты привёл - прогонять результаты через mb_strpos после поиска, чтоб найти фрагмент, содержащий данное слово. Хотя, если есть возможность, я бы подключил sphinx, он, во-первых, быстрее будет искать, во-вторых, у него уже есть такая функция, насколько помнится
     
  3. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Пробовал в цикле while, передавая mb_strpos строки $row['text_introduction'] и $word. Не получилось. На что обратить внимание?
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    на отдельной странице получается просто подсветить фразы из текста?
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Покажи код
     
    Drobotko Taras нравится это.
  6. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Нет. Пробовал вставить:
    PHP:
    1. if((mysqli_num_rows($mysqli_result)) ){
    2. while ($row = mysqli_fetch_assoc($mysqli_result))
    3. {  
    4.    if(mb_strpos($row['text_introduction'], $word));
    5.     '<b style="background:#FFFF00;">' . $word . '</b>';
    6. ...
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Можно так, и без strpos: https://stackoverflow.com/questions...word-in-the-string-if-it-contains-the-keyword, но обычно в результатах поиска не пихают весь текст, значит надо взять символов 100 до слова, символов 100 после текста, проверить, не обрезаешь ли ты слова, и к остатку применить регулярку из ссылки
     
  8. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Вроде просто, но в меня остается много вопросов. Не могли бы вы доработать файл, приведенный в начале, за вознаграждение? (Моя почта: drobotkot@gmail.com). Я бы проанализировал. Если нет, то куда могу обратиться?
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Напиши здесь во фриланс. Или @denis01 перенесёт
     
  10. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
  11. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Спасибо. Я проанализировал свой код. А также вставил и протестировал:
    PHP:
    1. $word = implode('|', build_word($user_search));
    2. $text = preg_replace('%(?<=[^\p{L}\p{N}])('.str_replace('*', '[\p{L}\p{N}]*', $word).')(?=[^\p{L}\p{N}])(?=[^>]*<)%ui', '<span style="background: yellow;">$1</span>',
    3.     '>'. $row['text_introduction'] .'<');
    4. $text = substr($text, 1, -1);
    5. print_r($text);
    Вишеприведенный код будет работать когда вместо $row['text_introduction'] подставить конкретну строку. Но мне надо сделать подсветку слов в записи столбца 'text_introduction' таблицы mysql. А если Вы ознакомились с моим кодом, который в начале темы, то видели, что я использую цикл while, чтобы вивести нужную запись. Проблема в том, что циклу надо передать вишеупомянутые переменные ($word, $text). Иначе этот код не будет работать внутри цикла. Как можно решить данную проблемму?
     
  12. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Перед циклом собираем нужный шаблон:
    PHP:
    1. $w = "[\p{L}\p{N}]";
    2. $pattern = "%(?<!$w)($word)(?!$w)%ui";
    А в цикле находим конструкцию:
    PHP:
    1. echo $row['text_introduction']
    И ставим вызов preg_replace():
    PHP:
    1.     $pattern,
    2.     '<span style="background: yellow;">$1</span>',
    3.     $row['text_introduction']
    4. );
     
    Drobotko Taras нравится это.
  13. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Огромное спасибо, Emilien!! С твоей помощью я научился делать подсветку на своем блоге! Слава Богу!
    Хотя код, приведенный Emilien, виделяет только 1 слово целиком, данный код можно доработать. Что я и сделал)
    Перед циклом вводил:
    PHP:
    1.  $pattern_array = array();
    2.    $build = build_word($user_search); //Функция build_word($user_search) возвращает массив слов. $user_search - переменная, что содержит переданную строку, которая введена пользователем в форму.
    3.     for($i=0; $i < (count(build_word($user_search))); $i++)  // count определяет количество слов в массиве
    4.     {
    5.    $word= $build[$i];
    6. $pattern = "/((?:^|>)[^<]*)(".$word.")/si"; // данный шаблон позволяет виводить слово, являющееся частю другого слова, независимо от регистра
    7. array_push($pattern_array, $pattern);  //шаблон $pattern с нужным словом вставляем в массив $pattern_array
    8. }
    В цикле на месте конструкции
    PHP:
    1. echo$row['text_introduction']
    я прописал:
    PHP:
    1. echo  preg_replace(
    2.     $pattern_array,
    3.     '$1<span style="background: yellow;">$2</span>',
    4.     $row['title']
    5.   );
    Но искомый текст ( на кирилице ) остается регистрозависимим. Например, когда введу в форму "плагін", то выделение есть, а в случае "Плагін" - нет. Как можно решить данную проблему? Кодировка таблицы и столбца - utf8_general_ci.
     
    #13 Drobotko Taras, 27 май 2017
    Последнее редактирование: 27 май 2017
  14. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Drobotko Taras нравится это.
  15. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Спасибо, применил. Тестируя поиск на своем блоге, заметил, что не все искомые слова и слоги подсвечиваются. Например, вводжу "ко" и получаю такую картинку (см. фото ниже). Пока не могу разобратся в чем дело. Анализирую. Буду очень благодарен, если поможете понять, в чем источник данного дефекта. Код с файла search.php додаю.
    PHP:
    1. <?php
    2.              require_once ('connectvars.php');
    3.                  $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    4.                  $user_search = $_GET['usersearch'];
    5.                  $user_search= quotemeta($user_search);//quotemeta — экранирует специальные символы
    6.              
    7.                 function build_word($user_search) {
    8.  
    9.     // Extract the search keywords into an array
    10.     $clean_search = str_replace(',', ' ', $user_search);
    11.     $search_words = explode(' ', $clean_search);
    12.     $final_search_words = array();
    13.     if (count($search_words) > 0) {
    14.       foreach ($search_words as $word) {
    15.         if (!empty($word)) {
    16.        
    17.            $final_search_words[] = $word;        
    18.       }
    19.       }
    20.   }
    21.   return $final_search_words;
    22.                 }
    23.  
    24.   // This function builds a search query from the search keywords and sort setting
    25.                
    26.   function build_query($user_search) {
    27.     $search_query = "SELECT count(`id`)  FROM `Blog_articles`" ;
    28.     // Extract the search keywords into an array
    29.     $clean_search = str_replace(',', ' ', $user_search);
    30.     $search_words = explode(' ', $clean_search);
    31.     $final_search_words = array();
    32.     if (count($search_words) > 0) {
    33.       foreach ($search_words as $word) {
    34.         if (!empty($word)) {
    35.           $final_search_words[] = $word;
    36.         }
    37.       }
    38.     }
    39.     // Generate a WHERE clause using all of the search keywords
    40.     $where_list = array();
    41.     if (count($final_search_words) > 0) {
    42.       foreach($final_search_words as $word) {
    43.         $where_list[] = "text_introduction OR title LIKE '%$word%'";
    44.       }
    45.     }
    46.     $where_clause = implode(' OR ', $where_list);
    47.  
    48.     // Add the keyword WHERE clause to the search query
    49.     if (!empty($where_clause)) {
    50.       $search_query .= " WHERE $where_clause ";
    51.     }
    52.     return $search_query;
    53.   }
    54.   function build_query1($user_search) {
    55.     $search_query1 = "SELECT Ba.title, Ba.date, Ba.rubric_id,
    56.  Ba.text_introduction, Ba.link,
    57.  Rubrics.rubric, Rubrics.translit_rubric
    58.      FROM Blog_articles AS Ba
    59.       INNER JOIN Rubrics USING (rubric_id)" ;
    60.     // Extract the search keywords into an array
    61.     $clean_search = str_replace(',', ' ', $user_search);
    62.     $search_words = explode(' ', $clean_search);
    63.     $final_search_words = array();
    64.     if (count($search_words) > 0) {
    65.       foreach ($search_words as $word) {
    66.         if (!empty($word)) {
    67.           $final_search_words[] = $word;
    68.         }
    69.       }
    70.     }
    71.     // Generate a WHERE clause using all of the search keywords
    72.     $where_list = array();
    73.     if (count($final_search_words) > 0) {
    74.       foreach($final_search_words as $word) {
    75.         $where_list[] = "Ba.text_introduction OR Ba.title LIKE '%$word%'";
    76.       }
    77.     }
    78.     $where_clause = implode(' OR ', $where_list);
    79.     // Add the keyword WHERE clause to the search query
    80.     if (!empty($where_clause)) {
    81.       $search_query1 .= " WHERE $where_clause ";
    82.       $search_query1 .= " ORDER BY Ba.title DESC LIMIT ";
    83.     }
    84.     return $search_query1;
    85.   }
    86. $page = intval($_GET[page]); // значение текущей страницы из GET
    87. $num = 3; // Переменная хранит число сообщений выводимых на станице
    88. if ($page==0) $page=1;
    89.   // Query to get the total results
    90.   $query = build_query($user_search);
    91. $mysqli_result = mysqli_query($dbc, $query);
    92.  
    93. if(mysqli_num_rows($mysqli_result)>0){
    94.     $count=mysqli_fetch_row($mysqli_result);
    95.     }
    96. $posts = $count[0]; // получем значение кол-во всех записей
    97. // Находим общее число страниц
    98. $total = intval(($posts - 1) / $num) + 1;
    99. // Определяем начало сообщений для текущей страницы
    100. $page = intval($page);
    101. // Если значение $page меньше единицы или отрицательно
    102. // переходим на первую страницу
    103. // А если слишком большое, то переходим на последнюю
    104. if(empty($page) or $page < 0) $page = 1;
    105. if($page > $total) $page = $total;
    106. // Вычисляем начиная c какого номера
    107. // следует выводить сообщения
    108. $start = $page * $num - $num;
    109.  
    110. // Проверяем нужны ли стрелки назад
    111. if ($page != 1) $pervpage = '<a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page=-1">Початок</a>
    112. <a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page='. ($page - 1).'"><</a> ';
    113. // Проверяем нужны ли стрелки вперед
    114. if ($page != $total) $nextpage = '  <a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search . '&page='. ($page + 1).'">></a>
    115. <a href="' .$_SERVER['PHP_SELF'].'?usersearch=' . $user_search . '&page='.$total.'">Кінець</a> ';
    116. // Находим две ближайшие станицы с обоих краев, если они есть
    117. if($page - 2 > 0) $page2left = ' <a href="' .$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page='. ($page - 2) .'">'. ($page - 2) .'</a>  ';
    118. if($page - 1 > 0) $page1left = '<a href="'.$_SERVER['PHP_SELF']. '?usersearch=' . $user_search .'&page='. ($page - 1) .'">'. ($page - 1) .'</a>  ';
    119. if($page + 2 <= $total) $page2right = '  <a href="'.$_SERVER['PHP_SELF']. '?usersearch=' . $user_search .'&page='. ($page + 2).'">'. ($page + 2) .'</a>';
    120. if($page + 1 <= $total) $page1right = '  <a href="'.$_SERVER['PHP_SELF'].  '?usersearch=' . $user_search .'&page='. ($page + 1).'">'. ($page + 1) .'</a>';
    121.  
    122. //получаем записи из БД (начиная с $start, кол-во записей = $num)
    123.  
    124. $query = build_query1($user_search);
    125. $query .= "$start, $num";
    126.     $mysqli_result = mysqli_query($dbc, $query);
    127.   if(mysqli_num_rows($mysqli_result)){
    128.  
    129.     $pattern_array = array();
    130.    $build = build_word($user_search);
    131.     for($i=0; $i < (count(build_word($user_search))); $i++)
    132.     {
    133.    $word= $build[$i];
    134. $pattern = "/((?:^|>)[^<]*)(".$word.")/ui";
    135. array_push($pattern_array, $pattern);  //шаблон $pattern с нужным словом вставляем в массив $pattern_array
    136.  
    137. }
    138.  
    139. while ($row = mysqli_fetch_assoc($mysqli_result))
    140. {
    141.   ?>
    142.   <div class="article">
    143.   <?php echo '<h3>' . '<a href="/' . $row['translit_rubric'] . '/' . $row['link'] . '">'?> <?php
    144. echo  preg_replace(
    145.     $pattern_array,
    146.     '$1<span style="background: yellow;">$2</span>',
    147.     $row['title']
    148.   ); ?> <?php echo '</a></h3>'; ?>
    149.                         <div class="info">
    150.                                     <div class="info-in">
    151.    <?php echo '<p> Рубрика: <a href="/' . $row['translit_rubric'] . '/'  . $row['translit_rubric'] . '_index.php"> ' .  $row['rubric'] . '</a> &nbsp;|&nbsp;' .
    152.        'Автор <a href=' . "'../Avtor.php'>Дроботько Тарас</a> | " . substr($row['date'], 0, -3) . '</p>';
    153. ?>                      
    154.                                     </div>
    155.               </div>
    156.                               <p class="indent"></p>
    157.                              
    158.      <p class="indent"> <?php
    159.  
    160.      echo  preg_replace(
    161.     $pattern_array,
    162.     '$1<span style="background: yellow;">$2</span>',
    163.     $row['text_introduction']
    164.      );?></p>
    165.         <p class="continue">[<a href=" <?php echo '/' . $row['translit_rubric'] . '/' . $row['link'] ?>">Читати далі&hellip;</a>]</p>
    166.   </div>
    167. <?php
    168.   }
    169.  
    170.     }
    171.   else {
    172.     echo '<p class="text-info" style=" font-weight: bolder;">На ваш запит, на жаль, нічого не знайдено.</p>';
    173.           echo '<img src="img/Poshuk.jpg" class="img-responsive center-block"  title="Пошук" alt="Пошук">';
    174.   }
    175. // если страниц больше чем одна
    176. if ($total>1) echo '<p><div align="center" class="navigation">'
    177. .$pervpage.$page2left.$page1left.'<span>'.$page.'</span>'.$page1right.$page2right
    178. .$nextpage.'</div></p>';
    179.  
    180.   mysqli_close($dbc);
    181. ?>
     

    Вложения:

    • Екран.png
      Екран.png
      Размер файла:
      70,4 КБ
      Просмотров:
      6
    #15 Drobotko Taras, 27 май 2017
    Последнее редактирование: 27 май 2017
    TeslaFeo нравится это.
  16. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    PHP:
    1. "/((?:^|>)[^<]*)($word)/ui"
    Код (Text):
    1. [^<]*
    По умолчанию квантификаторы жадные и захватывают максимальное количество текста. Вот и находит только последнее слово.
    Добавление знака вопроса к квантификатору переключает его режим с жадного на ленивый. Тогда шаблон будет искать ближайшее совпадение и найдёт всё что нужно.
    PHP:
    1. "/((?:^|>)[^<]*?)($word)/ui"
     
  17. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Большое спасибо, Emilien. Хотя результатом работы предложенного тобой шаблона было виделение только 1 искомого слова (слога) в начале текста, где производился поиск. Но обнаружил, что, поскольку, в моем случае, текст с $row['title'] и $row['text_introduction'] не содержит html-разметки, где замена искомых слов на слова с тегами могла бы поломать разметку, то можно упростить шаблон:
    PHP:
    1. $pattern = "#(". $word . ")#ui";
    А строку замены в preg_replace() на
    PHP:
    1. '<span style="background: yellow;">$1</span>'
    Заработало!
    Еще изменил в function build_query1($user_search) :
    PHP:
    1.  $where_list[] = " ((Ba.title OR Ba.text_introduction LIKE '%$word%') OR (Ba.text_introduction OR Ba.title LIKE '%$word%')) ";
    И прописал в function build_query($user_search) то же самое, только без надстройки Ва (синоним названия таблицы mysql). Дело в том, что поиск не находил слов, которые были только в $row['text_introduction'], поскольку Ba.text_introduction стояло перед оператором OR. Етот дефект запросов mysql можно увидеть, если проанализивать мой код в предыдущих сообщениях.
    На данный момент работа поиска с подсветкой удовлетворяет меня.
    :)
     
    #17 Drobotko Taras, 28 май 2017
    Последнее редактирование: 28 май 2017
  18. Drobotko Taras

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

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Приветствую! У меня возник еще один вопрос, когда я пробовал применить релевантность к поиску с подсветкой. Пробовал вот так:
    PHP:
    1.  function build_query1($user_search) {
    2.  
    3.     $clean_search = str_replace(',', ' ', $user_search);
    4.     $search_words = explode(' ', $clean_search);
    5.     $final_search_words = array();
    6.     if (count($search_words) > 0) {
    7.       foreach ($search_words as $word) {
    8.         if (!empty($word)) {
    9.           $final_search_words[] = $word;
    10.         }
    11.       }
    12.     }
    13.     // Generate a WHERE clause using all of the search keywords
    14.     $where_list = array();
    15.      $relevance = '0';
    16. $count = 0;
    17.     if (count($final_search_words) > 0) {
    18.  
    19.       foreach($final_search_words as $word) {
    20.         if ($count++ > 4) break;
    21.        $where_list[] = " ((Ba.title OR Ba.text_introduction LIKE '%$word%') OR (Ba.text_introduction OR Ba.title LIKE '%$word%')) ";
    22.      $relevance .= ' + (((LENGTH(Ba.title) -
    23.      LENGTH(REPLACE(Ba.title, "'.$word.'", ""))) / LENGTH("'.$word.'"))+((LENGTH(Ba.text_introduction) -
    24.      LENGTH(REPLACE(Ba.text_introduction, "'.$word.'", ""))) / LENGTH("'.$word.'")))';
    25.    
    26.       }
    27.       $relevance .= ' as relevance';
    28.    }
    29.    $search_query1 = "SELECT Ba.title, Ba.date, Ba.rubric_id,
    30.  Ba.text_introduction, Ba.link,
    31.  Rubrics.rubric, Rubrics.translit_rubric " . $relevance .
    32.      " FROM Blog_articles AS Ba
    33.       INNER JOIN Rubrics USING (rubric_id)" ;
    34.  
    35.    $where_clause = implode(' OR ', $where_list);
    36.     //Add the keyword WHERE clause to the search query
    37.    if (!empty($where_clause)) {
    38.   $search_query1 .= " WHERE $where_clause ";
    39.  
    40.       $search_query1 .= "  ORDER BY relevance DESC LIMIT ";
    41.    }
    42.  
    43.     return $search_query1;
    44.   }
    45. ....
    46. $query = build_query1($user_search);
    47. $query .= "  $start, $num";
    48. print_r($query);
    49.     $mysqli_result = mysqli_query($dbc, $query);
    50.   if(mysqli_num_rows($mysqli_result)){
    51. ....
    В результате, при вводе слова "плагин" в форму, появлялось сообщение, что ничего не найдено (см. фото). Что не так с запросом к базе данных mysql, что нужно изменить в запросе?
    --- Добавлено ---
    Разобрался. Перед $relevance в запросе пропустил кому.
     

    Вложения:

  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Если нужен поиск с релевантностью, надо ставить Sphinx :)