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

Статус
В этой теме нельзя размещать новые ответы.

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:
    i595815_sample.bmp



  • Firefox:
    i595885_sample.bmp
Причем в некоторых записях он есть, а в некоторых - нету. Как убрать этот квадратик?
 
что функ-ция the_title() делает? в ней по видимому этот символ есть.. боюсь на кофейной гуще врятли увижу чтотам)
 
Могу предположить, что проблема в кодировки, попробуй сохранить файл в UTF-8 без BOM
 
что функ-ция the_title() делает? в ней по видимому этот символ есть.. боюсь на кофейной гуще врятли увижу чтотам)
Смотрел в функциях шаблона "functions.php" там эта функция не указана. Может в самом файле сайдбара есть эта функция? я не нашел, может не там искал. Выложил его в аттаче.
Могу предположить, что проблема в кодировки, попробуй сохранить файл в UTF-8 без BOM
Этот баг выскакивает только в пунктах меню, в самом тексте его нету. Пробовал сохранять всё в UTF-8 без BOM, ничего не изменилось... :nezn:
 

Вложения

  • sidebar.rar
    1,2 KB · Просмотры: 4
В шаблоне вордпресс стоит такой код:
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:
    i595815_sample.bmp
  • Firefox:
    i595885_sample.bmp
Причем в некоторых записях он есть, а в некоторых - нету. Как убрать этот квадратик?

Если кодировка 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>
 
Там вместо русских букв используется что-то вроде
& # 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, -1, PREG_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);
  }
}
 
функция для корректного 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;
}
 
Если кодировка 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>

Заменил код, квадратики пропали! Большое спасибо! :)
Дальнейшие методы не пробовал, так как замена substr -> mb_substr всё решила. !:ay:
 
  • Заблокирован
  • #9
Сразу нужно думать, функция substr() работает некоректно для utf-8 кодировок
для utf-8 есть отдельный набор mb_* функций
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху