Помогите устранить баг

Тема в разделе "PHP", создана пользователем termit., 31 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. termit.

    termit. Постоялец

    Регистр.:
    12 мар 2008
    Сообщения:
    67
    Симпатии:
    31
    В шаблоне вордпресс стоит такой код:
    PHP:
    <li>
          <a href="<?php the_permalink() ?>" rel="bookmark"><?php $shorttitle substr(the_title('','',FALSE),0,25); ?><?php echo $shorttitle; if (strlen($shorttitle) >24){ echo '&hellip;'; } ?></a>
        </li>
    И кодга выводится собственно текст, то в конце текста появляется квадратик:
    • Chrome:[​IMG]


    • Firefox:[​IMG]

    Причем в некоторых записях он есть, а в некоторых - нету. Как убрать этот квадратик?
     
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    145
    Симпатии:
    108
    что функ-ция the_title() делает? в ней по видимому этот символ есть.. боюсь на кофейной гуще врятли увижу чтотам)
     
  3. g-prime

    g-prime איך בין גאָט

    Регистр.:
    11 авг 2008
    Сообщения:
    779
    Симпатии:
    1.131
    Могу предположить, что проблема в кодировки, попробуй сохранить файл в UTF-8 без BOM
     
  4. termit.

    termit. Постоялец

    Регистр.:
    12 мар 2008
    Сообщения:
    67
    Симпатии:
    31
    Смотрел в функциях шаблона "functions.php" там эта функция не указана. Может в самом файле сайдбара есть эта функция? я не нашел, может не там искал. Выложил его в аттаче.
    Этот баг выскакивает только в пунктах меню, в самом тексте его нету. Пробовал сохранять всё в UTF-8 без BOM, ничего не изменилось... :nezn:
     

    Вложения:

    • sidebar.rar
      Размер файла:
      1,2 КБ
      Просмотров:
      4
  5. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Если кодировка utf-8, надо использовать мультибайтовый эквивалент функции substr -> mb_substr
    PHP:
    <a href="<?php the_permalink() ?>" rel="bookmark"><?php $shorttitle mb_substr(the_title('','',FALSE),0,25); ?><?php echo $shorttitle; if (strlen($shorttitle) >24){ echo '&hellip;'; } ?></a>
     
    termit. нравится это.
  6. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    884
    Симпатии:
    540
    Там вместо русских букв используется что-то вроде
    & # 1040;
    mb_substr- пможет, но очень часто он не стоит на хосте
    Нужно лезть на php.net и искать альтернативы
    PHP:
    function html_substr($str$start$length NULL) {
      if (
    $length === 0) return ""//stop wasting our time ;)
      //check if we can simply use the built-in functions
      
    if (strpos($str'&') === false) { //No entities. Use built-in functions
        
    if ($length === NULL)
          return 
    substr($str$start);
        else
          return 
    substr($str$start$length);
      }
      
    // create our array of characters and html entities
      
    $chars preg_split('/(&[^;\s]+;)|/'$str, -1PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE PREG_SPLIT_OFFSET_CAPTURE);
      
    $html_length count($chars);
      
    // check if we can predict the return value and save some processing time
      
    if (
           (
    $html_length === 0) or
           (
    $start >= $html_length) or
           (isset(
    $length) and ($length <= -$html_length)) 
         )
        return 
    "";
      
    //calculate start position
      
    if ($start >= 0) {
        
    $real_start $chars[$start][1];
      } else { 
    //start'th character from the end of string
        
    $start max($start,-$html_length);
        
    $real_start $chars[$html_length+$start][1];
      }
      if (!isset(
    $length)) // no $length argument passed, return all remaining characters
        
    return substr($str$real_start);
      else if (
    $length 0) { // copy $length chars
        
    if ($start+$length >= $html_length) { // return all remaining characters
          
    return substr($str$real_start);
        } else { 
    //return $length characters
          
    return substr($str$real_start$chars[max($start,0)+$length][1] - $real_start);
        }
      } else { 
    //negative $length. Omit $length characters from end
          
    return substr($str$real_start$chars[$html_length+$length][1] - $real_start);
      }
    }
     
  7. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    функция для корректного substr() мультибайтовых символов
    PHP:
    function bite_str($string$start$len$byte=3)
    {
    $str     "";
    $count   0;
    $str_len strlen($string);
    for (
    $i=0$i<$str_len$i++) {
    if ((
    $count+1-$start)>$len) {
    $str  .= "...";
    break;
    } elseif ((
    ord(substr($string,$i,1)) <= 128) && ($count $start)) {
    $count++;
    } elseif ((
    ord(substr($string,$i,1)) > 128) && ($count $start)) {
    $count $count+2;
    $i     $i+$byte-1;
    } elseif ((
    ord(substr($string,$i,1)) <= 128) && ($count >= $start)) {
    $str  .= substr($string,$i,1);
    $count++;
    } elseif ((
    ord(substr($string,$i,1)) > 128) && ($count >= $start)) {
    $str  .= substr($string,$i,$byte);
    $count $count+2;
    $i     $i+$byte-1;
    }
    }
    return 
    $str;
    }
     
  8. termit.

    termit. Постоялец

    Регистр.:
    12 мар 2008
    Сообщения:
    67
    Симпатии:
    31
    Заменил код, квадратики пропали! Большое спасибо! :)
    Дальнейшие методы не пробовал, так как замена substr -> mb_substr всё решила. !:ay:
     
  9. FL@SH

    FL@SH Читатель

    Заблокирован
    Регистр.:
    20 июл 2008
    Сообщения:
    193
    Симпатии:
    25
    Сразу нужно думать, функция substr() работает некоректно для utf-8 кодировок
    для utf-8 есть отдельный набор mb_* функций
     
Статус темы:
Закрыта.