Похожие темы / Similar Topics

Еще добавил функцию удаления слов из трех букв и менее но не работает с русскими буквами
PHP:
function remove_short_words($slug) {
      $slug = explode(' ', $slug);
      foreach ($slug as $k => $word) {
        if (mb_strlen($word, 'utf-8') < 3) {
            unset($slug[$k]);
        }
    }
    return implode(' ', $slug);
}
 
И далее
если $count_similar == 0 то осуществляем поиск по стандартной схеме
 
Да кстати preg_replace не работает с кириллицей а-яА-Я в кодировке UTF-8, но если перечислить все символы по одиночке, то всё норм. Чисто моя наработка. Нигде больше не встречал простого решения

Я вот вообще не понимаю зачем там половина символов, если указан модификатор i. Вообще вариант с
PHP:
#([^-a-zа-яё\s]*)#iu
должен работать
 
Я вот вообще не понимаю зачем там половина символов, если указан модификатор i. Вообще вариант с PHP: #([^-a-zа-яёЁ\s]*)#iu должен работать

Не работает. Некоторые буквы жует и заменяет на непонятно что. У многих такая проблема http://unixforum.org/index.php?showtopic=123608
Мой вариант работает
 
Вася, допустим, но Вы указываете регистронезависимый шаблон (о чем свидетельствует модификатор i), зачем там половина символов. И модификатор u Вы видимо не замечаете, и его отсутствие в шаблонах у людей с проблемами
 
С модификатором i согласен, а вот с u по-моему не работало.
 
Вася, ну появится желание ради интереса проверьте, главное не перепутайте регистр модификатора
 
Допустим я согласен по поводу модификатора i, а вот с u всё равно не прокатывает. В любом случае под вечер уже мозги не варят и выкладываю свой вариант similar topics. В нем много корявостей и мусора, так что не пинайте, но он работает.
Сначала осуществляет поиск по 4 словам, если ничего не находит, то ищет стандартно.
PHP:
// Похожие темы НАЧАЛО
if ($t_data['allow_reg_tracker'])
{
      //$title = (strlen($topic_title) > 10) ? (substr($topic_title, 0, 10) . '') : $topic_title;
     
     
$title = preg_replace("#([^-A-Za-zйцукенгшщзхъфывапролджэячсмитьбюйЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁ_%\s]*)#i", '', $topic_title); // оставляем то что нужно в титле
 
$title = preg_replace('|-+|', ' ', $title);
$title = remove_short_words($title);
$title = smart_cut($title, 5); // режем титл до 2х слов     
$title = preg_replace('| +|', '%', $title);     
     
     
$sgl_search = "t.topic_title LIKE '%" . addslashes($title) . "%'";
//$sgl_search = "t.topic_title LIKE '" . addslashes($title) . "%'";
$title=str_replace('&','',$title);
 
//$porno_forums = $bb_cfg['porno_forums'] ? $bb_cfg['porno_forums'] : '1';
//  $trash_forums = $bb_cfg['trash_forum_id'] ? $bb_cfg['trash_forum_id'] : '0';
 
      $sql = "SELECT t.*, u.user_id, u.username, f.forum_id, f.forum_name, tor.size
            FROM ". BB_TOPICS ." t, ". BB_USERS ." u, ". BB_FORUMS ." f, ". BB_BT_TORRENTS ." tor
          WHERE t.topic_id != $topic_id
          AND tor.topic_id = t.topic_id
            AND $sgl_search
            AND f.allow_reg_tracker = 1
            AND t.forum_id = f.forum_id
            AND t.topic_poster = u.user_id
                    GROUP BY t.topic_title LIMIT 10";
                   
                   
                   
                   
                   
      if ( !($result = DB()->sql_query($sql)) )
      {
          message_die(GENERAL_ERROR, "Could not get main information for similar topics", '', __LINE__, __FILE__, $sql);
      }
 
 
 
 
     
      $similar = array();
      while ( $row = DB()->sql_fetchrow($result) )
      {
          $similar[] = $row;
      }
 
      $count_similar = count($similar);
     
//echo "<div style='display:none'>";
//var_dump($count_similar);
//echo "</div>";   
 
    
     
     
     
      if ( $count_similar > 0)
      {
          $template->assign_block_vars('similar', array());
 
            if ($count_similar > 2)
            {
              $page_cfg['use_tablesorter'] = true;
            }
          for($i = 0; $i < $count_similar; $i++)
          {
            $title = wbr(str_short($similar[$i]['topic_title'], 200));
            $topic_url = '<a title="'.$similar[$i]['topic_title'].'" href="viewtopic.php?'. POST_TOPIC_URL .'='. $similar[$i]['topic_id'].'">'. $title . '</a>';
 
            $poster_url = "profile.php?mode=viewprofile&amp;". POST_USERS_URL .'='. $similar[$i]['user_id'];
            $similar[$i]['username'] = wbr($similar[$i]['username']);
            $poster_username = '<a class="genmed" href="'. $poster_url .'">'. $similar[$i]['username'] .'</a>';
//$poster_username = $similar[$i]['username'];
          $forum_url = "viewforum.php?f=". $similar[$i]['forum_id'];
            $forum = '<a class="genmed" href="'. $forum_url .'">'. $similar[$i]['forum_name'] .'</a>';
 
          $tor_size = humn_size($similar[$i]['size']);
 
            $template->assign_block_vars('similar.topics', array(
                'TOPICS'    => $topic_url,
                'AUTHOR'    => $poster_username,
                'FORUM'      => $forum,
            'TOR_SIZE'    => $tor_size,
            ));
          }
      }
      else{
     
     
$title = (strlen($topic_title) > 10) ? (substr($topic_title, 0, 10) . '') : $topic_title;
      $sgl_search = "t.topic_title LIKE '%" . addslashes($title) . "%'";
 
            $sql = "SELECT t.*, u.user_id, u.username, f.forum_id, f.forum_name, tor.size
            FROM ". BB_TOPICS ." t, ". BB_USERS ." u, ". BB_FORUMS ." f, ". BB_BT_TORRENTS ." tor
          WHERE t.topic_id != $topic_id
          AND tor.topic_id = t.topic_id
            AND $sgl_search
            AND f.allow_reg_tracker = 1
            AND t.forum_id = f.forum_id
            AND t.topic_poster = u.user_id
            GROUP BY t.topic_title LIMIT 0,8";
      if ( !($result = DB()->sql_query($sql)) )
      {
          message_die(GENERAL_ERROR, "Could not get main information for similar topics", '', __LINE__, __FILE__, $sql);
      }
      $similar = array();
      while ( $row = DB()->sql_fetchrow($result) )
      {
          $similar[] = $row;
      }
      $count_similar = count($similar);
      if ( $count_similar > 0)
      {
          $template->assign_block_vars('similar', array());
 
            if ($count_similar > 2)
            {
              $page_cfg['use_tablesorter'] = true;
            }
          for($i = 0; $i < $count_similar; $i++)
          {
            $title = wbr(str_short($similar[$i]['topic_title'], 200));
            $topic_url = '<a title="'.$similar[$i]['topic_title'].'" href="viewtopic.php?'. POST_TOPIC_URL .'='. $similar[$i]['topic_id'].'">'. $title . '</a>';
 
            $poster_url = "profile.php?mode=viewprofile&amp;". POST_USERS_URL .'='. $similar[$i]['user_id'];
            $similar[$i]['username'] = wbr($similar[$i]['username']);
            $poster_username = '<a class="genmed" href="'. $poster_url .'">'. $similar[$i]['username'] .'</a>';
//$poster_username = $similar[$i]['username'];
          $forum_url = "viewforum.php?f=". $similar[$i]['forum_id'];
            $forum = '<a class="genmed" href="'. $forum_url .'">'. $similar[$i]['forum_name'] .'</a>';
 
          $tor_size = humn_size($similar[$i]['size']);
 
            $template->assign_block_vars('similar.topics', array(
                'TOPICS'    => $topic_url,
                'AUTHOR'    => $poster_username,
                'FORUM'      => $forum,
            'TOR_SIZE'    => $tor_size,
            ));
          }
      }     
     
     
     
     
      }
    }
// Похожие темы КОНЕЦ
 
Сейчас проверил. Вот результаты. Скрины для двух вариантов соответсвенно
$title = preg_replace("#([^-A-Za-zа-яА-ЯёЁ_%\s]*)#i", '', $title);
$title = preg_replace("#([^-A-Za-zа-яА-ЯёЁ_%\s]*)#iu", '', $title);
Видно что регулярка туповата и ей явно нужно указывать все символы

http://s020.*******.host/i704/1308/e8/a86409247f52.jpg



http://i053.*******.host/1308/8f/283c3d81faaf.jpg
 
Back
Top