[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Рекурсивная ф-ция разбиения текста на части
Gesandte
Добрый день.

Просьба помочь с данной функцией. Смысл в том, что передавая текст и максимально допустимое кол-во символов, он разбивает его на части, в соответствие с этим значение и пишет в массив. Все работает, за исключением того, что не могу корректно составить условие прекращения рекурсии...В данном случае остаток текста, самый последний элемент, в массив не пишется.

$this->text['source'] - исходный текст
$this->text['length'] - допустимая длинна символов в одно части


private function partition() {
$this->inner['textLength'] = strlen($this->text['source']);
$this->inner['positionEnd'] = strpos($this->text['source'], " ", $this->text['length']);
$this->part[] = substr($this->text['source'], 0, $this->inner['positionEnd']);
$this->text['source'] = substr($this->text['source'], $this->inner['positionEnd']);

if(($this->inner['textLength'] - $this->inner['positionEnd']) < $this->text['length']) {
return $text;
}

$this->partition();
}




Спустя 18 минут, 9 секунд (22.07.2012 - 16:49) dadli написал(а):
Gesandte
$str = "Просьба помочь с данной функцией";
$length = 3;
preg_match_all("#.{".$length."}|.{1,".$length."}$#iu",$str,$mas);


echo '<pre>';
var_dump($mas);
echo '</pre>';



?

Спустя 13 минут, 51 секунда (22.07.2012 - 17:03) kamanch написал(а):
Цитата
return $text;

А это что такое? Может быть $this->text

А вообще, класс бы выложил со свойствами, а то не очень понятно.

Спустя 4 минуты, 22 секунды (22.07.2012 - 17:08) Gesandte написал(а):
dadli, спасибо)

но немного не то, по тексту не упомянул, в коде видно
$this->inner['positionEnd'] = strpos($this->text['source'], " ", $this->text['length']);


слова пополам не режем, а ищем их окончания..

Спустя 4 минуты, 56 секунд (22.07.2012 - 17:12) Gesandte написал(а):
h.n.81 , честно сам думал почему $text и откуда.....)
Тестовый пример



class format {
public $text;
private $part = array();
private $inner = array();

private function partition() {
$this->inner['textLength'] = strlen($this->text['source']);
$this->inner['positionEnd'] = strpos($this->text['source'], " ", $this->text['length']);
$this->part[] = substr($this->text['source'], 0, $this->inner['positionEnd']);
$this->text['source'] = substr($this->text['source'], $this->inner['positionEnd']);

echo $this->inner['positionEnd']." == ".$this->text['length'];
echo "<br />";

if(($this->inner['textLength'] - $this->inner['positionEnd']) < $this->text['length']) {
return;
}

$this->partition();
}

public function formatText() {
# Форматируем текст
$this->partition();

# Считаем количество элементов в массиве
$countElements = count($this->part);

$i = "0";
# Прогоняем массив
foreach ($this->part as $part) {
# Выводим сожержимое
echo $part;
$i++;

# Вставляем разделитель
if ($countElements !== $i) {
echo "<br /> --- <br />";
}
}
}
}



$format = new format;

$format->text['source'] = "B Mansory predstavili tuningoviy Aventador c polnostiu karbonovim kuzovom. Noviy Lamborghini Aventador Carbon";
$format->text['length'] = "10";

echo $format->formatText();

Спустя 12 минут, 11 секунд (22.07.2012 - 17:25) dadli написал(а):
Gesandte
что-то не понял какои резултат ви хотите получить? например есть такои текст
$text = "a b ssdd fghjberbernetnkl";
и длина: 5

какои резултат ви хотите получить из етого текста?

Спустя 21 минута, 45 секунд (22.07.2012 - 17:46) Gesandte написал(а):
dadli,

1 - a b ssdd
2 - fghjberbernetnkl

тексты планируются достаточно большие, поэтому погрешность +/- несколько символов безразлична

Спустя 16 минут, 10 секунд (22.07.2012 - 18:03) kamanch написал(а):
Ты проверил, что там в строке осталось? Меньше 10? Ага... тогда выходим... а остаток строки забыли и потеряли...

Исправляй на:
		if(($this->inner['textLength'] - $this->inner['positionEnd']) < $this->text['length']) {
$this->part[] = $this->text['source'];
return;
}

Спустя 6 минут, 48 секунд (22.07.2012 - 18:09) Gesandte написал(а):
h.n.81 и вправду, спасибо)

Спустя 16 минут, 17 секунд (22.07.2012 - 18:26) killer8080 написал(а):
Gesandte
так?
$length = 25; 
$text = 'тексты планируются достаточно большие, поэтому погрешность +/- несколько символов безразлична';
$words = explode(' ', $text);
$from = 0;
$n = 0;
$count = 0;
$parts = array();
foreach($words as $word){
$count += mb_strlen($word, 'UTF-8');
$n++;
if($count >= $length){
$parts []= implode( ' ', array_slice($words, $from, $n - $from) );
$from = $n;
$count = 0;
}
}


echo '<pre>'.print_r($parts, 1).'</pre>';

Спустя 47 минут, 14 секунд (22.07.2012 - 19:13) Gesandte написал(а):
killer8080, как то не так работает...

при $length = 10;

на выходе имеем
Array
(
[0] => тексты планируются достаточно большие,
[1] => поэтому погрешность +/- несколько
)

а должны примерно так,
Array
(
[0] => тексты планируются
[1] => достаточно
[2] => большие, поэтому
[3] => погрешность
[4] => +/- несколько
)

и окончание режет, не выводит

Спустя 3 минуты, 46 секунд (22.07.2012 - 19:17) killer8080 написал(а):
Цитата (Gesandte @ 22.07.2012 - 19:13)
killer8080, как то не так работает...

при $length = 10;

у меня так
Array
(
[0] => тексты планируются
[1] => достаточно
[2] => большие, поэтому
[3] => погрешность
[4] => +/- несколько
[5] => символов безразлична
)

Кодировку правильно указываешь для mb_strlen?

Спустя 2 минуты, 9 секунд (22.07.2012 - 19:19) Gesandte написал(а):
действительно, забыл перекодировать файл в ютф, спасибо)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.