|
|
|
| Задача:
Есть огромный текст в файле, необходимо его разбить на абзацы, содержащие $len символов.
Сейчас есть такой вариант:
<?php
$len = 700;
$file = 'tpl.txt';
$fp = file_get_contents($file);
$strlen = strlen($fp);
$stop = array ('.', '!', '?', ';');
$from = array (' ', '«', '»', '"');
$to = array (' ', '«', '»', '"');
$str = str_replace($from, $to, $fp);
$str = '<p>'.wordwrap($str, $len, '</p><p>').'</p>';
echo $str;
?>
|
Но при таком подходе абзац может разорваться посреди предложения, а хотелось бы чтобы разрывалось по концу предложения($stop)
Есть предложение? | |
|
|
|
|
|
|
|
для: mihdan
(16.07.2008 в 10:55)
| | Все эти символы могут встретиться и в середине предложения. | |
|
|
|
|
|
|
|
для: mihdan
(16.07.2008 в 10:55)
| | Считывайте $len символов, а потом считывайте до тех пор, пока не встретите один из символов из $stop - это Ваш абзац. И так далее. | |
|
|
|
|
|
|
|
для: BinLaden
(16.07.2008 в 10:59)
| | Пример можно? | |
|
|
|
|
|
|
|
для: 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($fh, 128);
}
while( $t !== '' && ( $chr = substr(strpbrk($t, $stop_charlist), 0, 1) ) === false );
if( $chr === false ) break;
$t = substr($t, strpos($t, $chr) + 1);
$b .= substr($b, 0, - strlen($t));
$p[] = $b;
}
$p[] = $t . $b;
fclose($fh);
return '<p>' . implode('</p><p>', $p) . '</p>';
}
echo swrap('tpl.txt', 700);
?>
|
| |
|
|
|
|
|
|
|
для: BinLaden
(16.07.2008 в 11:43)
| | Коцает наглухо весь текст | |
|
|
|
|
|
|
|
для: mihdan
(16.07.2008 в 13:11)
| | А у меня работает. Приведите пример текста. | |
|
|
|
|
 29 Кб |
|
|
для: BinLaden
(16.07.2008 в 13:23)
| | см аттач
В некоторых местах просто обрезает кусок текста | |
|
|
|
|
|
|
|
для: mihdan
(16.07.2008 в 16:57)
| | > В некоторых местах просто обрезает кусок текста
"Ну здрасьте!" называется. Вы обрезанными кусками текста называете такие пропуски между предложениями? Это же пропуски между абзацами, которые ставит Ваш браузер.
Или приведите конкретное слово/предложение, которое кануло в небытиё. Я таких не нашёл.
P.S. Правда не понятно, зачем Вы указали в $stop символ ";" (точка с запятой). Вроде как концом предложения этот символ никогда не служит. | |
|
|
|
|
|
|
|
для: BinLaden
(16.07.2008 в 17:02)
| | BinLaden - это уже не важно, реализовал по-другому, так как не было времени разбираться. Задача горит. А режет ваш скрипт жестко-пропадают целые абзацы, причем по непонятному алгоритму
>Это же пропуски между абзацами, которые ставит Ваш браузер.
Не нужно называть меня дауном HTML, CSS знаю поболее вашего | |
|
|
|
|
|
|
|
для: 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($fh, 256);
$pos = strpos($t, substr(strpbrk($t, $stop_charlist), 0, 1));
}
while( $pos === false && !feof($fh) );
if( $pos !== false )
{
$p[] = substr($b, 0, strpos($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)
?>
|
> знаю поболее вашего
Найдите хоть одного человека на этом форуме, кто бы в этом сомневался:) Вы же - гений.
> реализовал по-другому,
А Вы как решили, если не секрет? Поделитесь опытом. | |
|
|
|
|
|
|
|
для: 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 (' ', '«', '»', '"', '', '', '', '');
$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>
|
| |
|
|
|
|