Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: "Умный" wordwrap
 
 автор: mihdan   (16.07.2008 в 10:55)   письмо автору
 
 

Задача:
Есть огромный текст в файле, необходимо его разбить на абзацы, содержащие $len символов.
Сейчас есть такой вариант:


<?php
$len 
700;
$file 'tpl.txt';
$fp file_get_contents($file);
$strlen strlen($fp);
$stop = array ('.''!''?'';');
$from = array ('  ''«''»''"');
$to = array (' ''&laquo;''&raquo;''&quot;');

$str str_replace($from$to$fp);

$str '<p>'.wordwrap($str$len'</p><p>').'</p>';
echo 
$str;
?>


Но при таком подходе абзац может разорваться посреди предложения, а хотелось бы чтобы разрывалось по концу предложения($stop)

Есть предложение?

   
 
 автор: sms-send   (16.07.2008 в 10:59)   письмо автору
 
   для: mihdan   (16.07.2008 в 10:55)
 

Все эти символы могут встретиться и в середине предложения.

   
 
 автор: BinLaden   (16.07.2008 в 10:59)   письмо автору
 
   для: mihdan   (16.07.2008 в 10:55)
 

Считывайте $len символов, а потом считывайте до тех пор, пока не встретите один из символов из $stop - это Ваш абзац. И так далее.

   
 
 автор: mihdan   (16.07.2008 в 11:03)   письмо автору
 
   для: BinLaden   (16.07.2008 в 10:59)
 

Пример можно?

   
 
 автор: BinLaden   (16.07.2008 в 11:43)   письмо автору
 
   для: mihdan   (16.07.2008 в 11:03)
 

Грубо говоря, как-то так:

<?php
set_time_limit
(3);

function 
swrap($file$len)
{
    
$stop = array ('.''!''?'';');
    
$stop_charlist implode$stop );

    
$p = array();

    
$t '';

    
$fh fopen($file'rb');

    while( ( 
$b fread($fh$len 1) ) !== '' )
    {
        
$b $t $b;

        
$t '';

        do
        {
            
$b .= $t fread($fh128); 
        }
        while( 
$t !== '' && ( $chr substr(strpbrk($t$stop_charlist), 01) ) === false );

        if( 
$chr === false ) break;

        
$t substr($tstrpos($t$chr) + 1);
        
$b .= substr($b0, - strlen($t));

        
$p[] = $b;
    }

    
$p[] = $t $b;

    
fclose($fh);

    return 
'<p>' implode('</p><p>'$p) . '</p>';
}

echo 
swrap('tpl.txt'700);
?>

   
 
 автор: mihdan   (16.07.2008 в 13:11)   письмо автору
 
   для: BinLaden   (16.07.2008 в 11:43)
 

Коцает наглухо весь текст

   
 
 автор: BinLaden   (16.07.2008 в 13:23)   письмо автору
 
   для: mihdan   (16.07.2008 в 13:11)
 

А у меня работает. Приведите пример текста.

   
 
 автор: mihdan   (16.07.2008 в 16:57)   письмо автору
29 Кб
 
   для: BinLaden   (16.07.2008 в 13:23)
 

см аттач

В некоторых местах просто обрезает кусок текста

   
 
 автор: BinLaden   (16.07.2008 в 17:02)   письмо автору
 
   для: mihdan   (16.07.2008 в 16:57)
 

> В некоторых местах просто обрезает кусок текста

"Ну здрасьте!" называется. Вы обрезанными кусками текста называете такие пропуски между предложениями? Это же пропуски между абзацами, которые ставит Ваш браузер.

Или приведите конкретное слово/предложение, которое кануло в небытиё. Я таких не нашёл.

P.S. Правда не понятно, зачем Вы указали в $stop символ ";" (точка с запятой). Вроде как концом предложения этот символ никогда не служит.

   
 
 автор: mihdan   (16.07.2008 в 18:50)   письмо автору
 
   для: BinLaden   (16.07.2008 в 17:02)
 

BinLaden - это уже не важно, реализовал по-другому, так как не было времени разбираться. Задача горит. А режет ваш скрипт жестко-пропадают целые абзацы, причем по непонятному алгоритму

>Это же пропуски между абзацами, которые ставит Ваш браузер.

Не нужно называть меня дауном HTML, CSS знаю поболее вашего

   
 
 автор: BinLaden   (16.07.2008 в 22:21)   письмо автору
 
   для: mihdan   (16.07.2008 в 18:50)
 

Понял в чём проблема.

Вот, исправленный, оптимизированный:)

<?php
function swrap($file$len

    
$stop_charlist '.!?;';

    
$p = array(); 

    
$t ''

    if( 
filesize($file) <= $len )
    {
        return 
'<p>' file_get_contents($file) . '</p>';
    }

    
$fh fopen($file'rb'); 

    while( ( 
$b fread($fh$len 1) ) !== '' )
    {
        do 
        {
            
$b .= $t fread($fh256);
            
$pos strpos($tsubstr(strpbrk($t$stop_charlist), 01));
        } 
        while( 
$pos === false && !feof($fh) ); 

        if( 
$pos !== false )
        {
            
$p[] = substr($b0strpos($b$t) + $pos 1);
            
$t substr($t$pos 1);

            
fseek($fh, - strlen($t), SEEK_CUR);
        }
        else
        {
            
$p[] = $b;
        }
    } 

    
fclose($fh); 

    return 
'<p>' implode('</p><p>'$p) . '</p>'
}

$a file_get_contents('file.txt');
$a strip_tags($a);
$a preg_replace('/\\s+/'''$a);

$b swrap('file.txt'700);
$b strip_tags($b);
$b preg_replace('/\\s+/'''$b);

var_dump(md5($a) == md5($a)); # bool(true)
?>


> знаю поболее вашего
Найдите хоть одного человека на этом форуме, кто бы в этом сомневался:) Вы же - гений.

> реализовал по-другому,
А Вы как решили, если не секрет? Поделитесь опытом.

   
 
 автор: mihdan   (17.07.2008 в 11:34)   письмо автору
 
   для: BinLaden   (16.07.2008 в 22:21)
 

По порядку - ваш вариант работает спасибо, но все оказалось можно решить проще.

Есть журнал в PDF размером в 1000 страниц, копирую его текстовую часть в WORD, преобразую при помощи макроса в HTML, но и обрыв строки и параграф заменяется на <p>, получается что каждая строка - новый параграф, что не есть хорошо.

Поэтому решил сперва вырезать все и разбить по новой используя алгоритм, по которому вы писали скрипт. Но этот вариант отпал, когда более внятно просмотрел структура исходного документа - скрипт получился такой:


<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    
$from = array ('  ''«''»''"'"\r"" \n""-\n""\t");
    
$to = array (' ''&laquo;''&raquo;''&quot;''''''''');

    
$prolog '<br /><!--#include virtual="inc/menu2.html" -->';

    
$text trim($_POST['text']);
    
$name '<h3>'.trim($_POST['name']).'</h3>';

    
$str str_replace($from$to$text);
    
$str '<p>'.str_replace("\n"'</p><p>'$str).'</p>';

    
$typo $prolog.$name.$str;
}
?>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
    <table>
        <tr>
            <td>Название статьи:</td>
        </tr>
        <tr>
            <td><input type="text" name="name" size="160" /></td>
        </tr>
        <tr>
            <td>Текст для конвертации:</td>
        </tr>
        <tr>
            <td><textarea name="text" id="text" style="width: 100%;" rows="19"><?=(!empty($typo)) ? $typo '';?></textarea></td>
        </tr>
        <tr>
            <td align="right"><a href="javascript:subtractHeight('text');">[-]</a> <a href="javascript:addHeight('text');">[+]</a></td>
        </tr>
        <tr>
            <td><input type="submit" value="Оттипографить нах" /> <input type="button" onclick="clearArea('text')" value="Очистить" /></td>
        </tr>
    </table>
</form>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования