Strlen для не английского языка

я хочу отображать краткое описание статей на главной странице. Описания представляют собой смесь тайского и английского языков.

Я использую эту функцию для strlen

mb_strlen($str, 'UTF-8');

но это не точно, так как некоторые описания заканчиваются всего одной строкой, а некоторые доходят до 3 строк, и я хочу показать описания двух строк.

Если strlen больше 155, я делаю

$descr = mb_strlen($descr, 'UTF-8') > 155 ? substr($descr, 0, 152) . '...' : $descr;

Благодарю вас.


person Shishant    schedule 25.02.2010    source источник
comment
Я не понимаю ни проблемы (не понимаю, в чем дело со строками), ни вашего вопроса. Вы можете уточнить?   -  person Pekka    schedule 25.02.2010
comment
Я тоже не понимаю. :/   -  person Teekin    schedule 25.02.2010
comment
Вероятно, он хочет сделать это: stackoverflow.com/questions/2154220/ и имеет проблему, что mb_strlen и str_len некоторые символы подсчитываются дважды из-за того, что они многобайтовые.   -  person Gordon    schedule 25.02.2010
comment
кстати, насколько я помню, вы должны использовать mb_substr вместо substr в этом случае   -  person shuvalov    schedule 25.02.2010
comment
Причина, по которой я делаю strlen, заключается в том, чтобы представить только краткие описания на главной странице сайта, поскольку функция strlen не является точной для неанглоязычного языка, описания нарушают дизайн сайта, поскольку некоторые из них слишком маленькие/большие.   -  person Shishant    schedule 25.02.2010
comment
@Gordon Гордон, проблема с функцией в упомянутой вами ссылке заключается в том, что она добавляет ..., даже если описание короче 150 символов.   -  person Shishant    schedule 25.02.2010
comment
@Shishant Функция будет усечена до любой длины, которую вы укажете для $chars. Итак, ваш вопрос действительно заключается в том, как я могу обрезать многобайтовую строку до 150 символов? Правильный? У нас все еще есть проблемы с пониманием того, что вы на самом деле хотите.   -  person Gordon    schedule 25.02.2010


Ответы (3)


Глифы, графические представления символов, имеют разную ширину в разных шрифтах. Просто сравните m с i:

мммммммммм
ииииииииии

Оба символа повторяются десять раз. Но глиф m намного шире, чем глиф i.

Таким образом, вы не можете вывести ширину его графического представления из количества символов (кроме моноширинных шрифтов).

person Gumbo    schedule 25.02.2010
comment
Итак... как бы вы это сделали? :) - person Adam Kiss; 25.02.2010
comment
+1 за правильную (я думаю) интерпретацию неясного вопроса :) - person Nick Meyer; 25.02.2010
comment
Это не имеет большого значения, я понимаю это, но это вызывает разницу не из-за ширины, а из-за сильных различий в языках. - person Shishant; 25.02.2010
comment
@Shishant: Можете ли вы привести пример? - person Gumbo; 25.02.2010
comment
@Gumbo: 3 строки Description:2NE1 - Fire & I Don't Care on Music Core (2010-02-20) SS: http://img.fakrub.com/fakRubDownload.php?id=3756_4B80DCB6 ตัวเล็ก คุณภาพใหญ่ Enjoy The Show ! 1 строка บางครั้งเราก็มองข้ามสิ่งเล็กๆ น้อยๆ ไป เพียงเพราะใช้�... - person Shishant; 25.02.2010
comment
@Shishant: Значит, первый пример просто отображается в три строки? - person Gumbo; 25.02.2010
comment
@gumbo/@shrishant: Насколько я понимаю, мы говорим о веб-приложении. Так что, если его веб-страница будет лучше, если весь текст будет помещен на страницу, а JavaScript и CSS сделают остальную работу? - person Anil Namde; 25.02.2010
comment
@Gumbo Да, он отображается в 3 строки и в одну строку после усечения. - person Shishant; 25.02.2010
comment
@Shishant: Ну, как я уже сказал: разные глифы имеют разное измерение. Вам нужно знать фактические глифы и их размеры, чтобы получить ровно одну строку. Лучше всего сделать это на стороне клиента с помощью JavaScript. - person Gumbo; 25.02.2010
comment
@Shishant: взгляните на это: adamhooper.com/bodacity/playground/jquery.excerpt .html - person Gumbo; 25.02.2010
comment
Из количества символов для моноширинных шрифтов также нельзя вывести ширину его графического представления. Например, текст может содержать сочетающиеся символы. - person Mechanical snail; 23.08.2011

substr небезопасно использовать для данных utf-8. Используйте mb_substr

person troelskn    schedule 25.02.2010

если вы хотите предотвратить записи с 3 или более строками, сначала разделите строку на '\n', а затем выполните обрезку с помощью mb_substr

person shuvalov    schedule 25.02.2010