LINUX.ORG.RU

Напишите за меня код. Я устал:(

 ,


0

1

Насколько я понял PHP не очень-то дружит с UTF.
Но я устал и голова не варит, может у кого уже есть подобный кусок кода?

Итак:
Нужна ф-ция, делящая UTF-8 строку на подстроки длиной не более символов, чем указано.
Очень желательно, чтобы какое-то буквосочетание в исходной строке означало перевод каретки, т.е. создавало очередную подстроку.

Например: Строка «Бла бла<br>Троло ло ло ло ло ло <br> ло ло ло» с ограничением в 10 символов выдаст наружу массив
1)Бла бла
2)Троло ло
3)ло ло ло
4) ло ло ло

Вот как-то так.
Поделитесь кодом или опытом.

★★☆

Последнее исправление: cetjs2 (всего исправлений: 1)

При чем тут UTF-8? Хотя, если с ним проблема возникает, что мешает перегнать в однобайтовую кодировку и работать с ней?

Вообще я бы сначала теги убрал strip_tags()...

gobot ★★★★
()
Ответ на: комментарий от gobot

Про убирание тегов прогнал, не внимательно прочел задачу ) Разбить по ним можно, например. Короче вариантов куча. Споки-ноки

gobot ★★★★
()
Ответ на: комментарий от gobot

При чем тут UTF-8?

Ну хотя при том, что граничная длина строки задаётся в символах, а в байтах.

Stahl ★★☆
() автор топика

Одну 'ло' пропустил, у тебя должен получиться массив из 5 элементов

bismi
()

у меня получилось так

#!/usr/bin/env python3

def wrap(line, length=10):
    if len(line) < length: return [line]
    res = []
    while True:
        try:
            if line[length-1] == ' ':
                pos = length - 1
            else:
                pos = line.rfind(' ', 0, length-1)
            res.append(line[:pos].strip())
            line = line[pos:]
        except IndexError:
            res.append(line.strip())
            break
    return res


if __name__ == '__main__':
    s = "Бла бла<br>Троло ло ло ло ло ло <br> до до до"
    ctr = ['Бла бла', 'Троло ло', 'ло ло ло', 'ло', 'до до до']
    res = []
    for line in s.split('<br>'):
            res.extend(wrap(line.strip(), 10))

    assert ctr == res
    print(res)

bismi
()
Ответ на: комментарий от bismi

Проблема в PHP.
Вот если бы ты это на PHP написал... это было бы здорово.
Не думаю, что мешать питон, пхп (а если пойдёт такая жара, то я часть кода и на си напишу) в одну кучу хорошая идея.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Тебе уже про mbstring сказали, какие ещё вопросы?

Wizard_ ★★★★★
()
Ответ на: комментарий от Stahl

ёпт я лоханулся, на python вообще вот так

from textwrap import wrap

s = "Бла бла<br>Троло ло ло ло ло ло <br> до до до"
ctr = ['Бла бла', 'Троло ло', 'ло ло ло', 'ло', 'до до до']
res = []
for line in s.split('<br>'):
        res.extend(wrap(line.strip(), 10))

assert ctr == res
print(res)

bismi
()
Ответ на: комментарий от gobot

Вот не первый раз сталкиваюсь с таким советом, но мне интересно, что будет после этого:

предварительно переводи в win-1251

с такой строкой:

яп. 津波 IPA: [t͡sɯnä́mí], где 津 — «порт, залив», 波 — «волна»

fetfrum
()

странно, что никто не посоветовал mbstring

xtraeft ★★☆☆
()
$str = ... ;//строка
$break_char = ... ;//символ для разбиения на строки
$length = ... ; //длина подстроки

$result = explode($str,$break_char);

for($i=0;$i<count($result);$i++)
{
$result[i]=substr($result[i],0,$length);
}

В $result будет массив подстрок указанной длины

Megamozg
()

вот поголодаешь и напишется

anonymous
()
Ответ на: комментарий от Megamozg

В $result будет массив подстрок указанной длины

array (
  0 => 'Бла бла',
  1 => 'Троло ло л',
  2 => ' ло ло ло',
)

не совсем то что нужно ТСу

bismi
()

Гр-р-р-р.
Короче слепил некоего Франкенштейна из нескольких примеров.
Работает удовлетворительно.

P.S. Какой вообще смысл в существовании PHP если он «из коробки» не дружит с UTF? Этот язык для Web заточен или как?
Или там, в стране эльфов, не слышали про мультибайтные кодировки?
Треш.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

в него пихают все, что ни попадя, вот и происходят такие случаи.

rikardoac
()
Ответ на: комментарий от bismi
$len = 11;
$break_char = '<br>'; // Спецсимволы надо экранировать 
$pattern =sprintf('/([^%s]{%s})/u',$break_char, $len);
$replacement = sprintf('$1%s',$break_char);
$res = preg_replace($pattern,$replacement,$str);
var_dump(preg_split('/'.$break_char.'/',$res));

PS: Автор троль,т.к при 10 символах на выходе получается

array(
  0=>"Бла бла"
  1=>"Троло ло л"
  2=>"о ло ло ло"
  3=>" "
  4=>" ло ло ло"
}
И никакой ошибки тут нет

anthill
()
Ответ на: комментарий от Stahl

Вот если бы ты это на PHP написал

а зачем на пыхе писать что-то, что работает с текстом?

AGUtilities ★★★
()

Чего-то KRoN73 не видно, помнится он тут частенько PHP нахваливал.

ef37 ★★
()
Ответ на: комментарий от Stahl

Итак:
Нужна ф-ция, делящая UTF-8 строку на подстроки длиной не более >символов, чем указано.
Очень желательно, чтобы какое-то буквосочетание в исходной строке >означало перевод каретки, т.е. создавало очередную подстроку.

О том, что нельзя разрывать слова где попало.

Где вы это увидели в исходной постановке задачи?

PS: вот держите без «единого разрыва»

<?php
$str='Бла бла<br>Троло ло ло ло ло ло <br> ло ло ло';

function utf8_wordwrap($string, $width=75, $break="\n")
{
       $search = '/([^<br>]{1,'.$width.'})(?:\s|<br>|$)/u';
       $replace = '$1'.$break;
    
   $string=preg_replace($search, $replace, $string);
   return preg_replace('/'.$break.'$/','',$string);
}
echo utf8_wordwrap($str,10,'<br>')."\n";
var_dump(preg_split('/<br>/',utf8_wordwrap($str,10,'<br>')));
?>

anthill
()
Ответ на: комментарий от gobot

Если эта строка получена извне, то вероятность стремится к единице.

fetfrum
()
Ответ на: комментарий от xtraeft

ты принципиально комментарии про mbstring игнорируешь?

Комментарии про mbstring дают вменяемые, а всех вменяемых он судя по всему в игнорлист внес :-)

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

хорошая практика.
а может, просто «тонко» пытался кинуть камень в огород php

xtraeft ★★☆☆
()
Ответ на: комментарий от no-dashi

Ну блин.
Что за мода всех считать идиотами?
Кто-то думает что mb_ не гуглится за пять секунд?
Кто-то вообще читает начальный пост?
Ну конечно же нет. Это же лор. Тут принято «теги читай@фигню отвечай».

Stahl ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.