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

L

ler

Гость
Еще добавил функцию удаления слов из трех букв и менее но не работает с русскими буквами
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);
}
 

Nightmare

Легенда
Да кстати preg_replace не работает с кириллицей а-яА-Я в кодировке UTF-8, но если перечислить все символы по одиночке, то всё норм. Чисто моя наработка. Нигде больше не встречал простого решения

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

ler

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

Не работает. Некоторые буквы жует и заменяет на непонятно что. У многих такая проблема

Please Login or Register to view hidden text.


Мой вариант работает
 

Nightmare

Легенда
Вася, допустим, но Вы указываете регистронезависимый шаблон (о чем свидетельствует модификатор i), зачем там половина символов. И модификатор u Вы видимо не замечаете, и его отсутствие в шаблонах у людей с проблемами
 

Nightmare

Легенда
Вася, ну появится желание ради интереса проверьте, главное не перепутайте регистр модификатора
 
L

ler

Гость
Допустим я согласен по поводу модификатора 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,
            ));
          }
      }     
     
     
     
     
      }
    }
// Похожие темы КОНЕЦ
 
L

ler

Гость
Сейчас проверил. Вот результаты. Скрины для двух вариантов соответсвенно
$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
 

Wertos

Пользователь
/[(\w)|(\x7F-\xFF)|(\s)]/


Please Login or Register to view hidden text.


Код:
Этот код вырезает все, кроме русско/английских букв и цифр: $s = preg_replace("/[^\\w\\x7F-\\xFF\\s]+/s", $s);
 
Сверху