Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обрезать строку с форматированием 
:(
    Опции темы
ksnk
Дата 20.4.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Gold Dragon, Есть мысль - заставить юзера(юзеровый броузер) самого впилить все нужные теги...
Новости - это кусочки откопипащеных html'ей? Тогда нужно просто вставить этот текст в какой-то фрейм в html документе, на клиентской стороне у самого "редактора", а потом брать с собой на сервер то, что броузер уже успел "открыть-закрыть". Просто у броузера уже есть механизм исправления корявого кода и им вполне можно пользоваться  smile Заодно это будет последним китайским предупреждением редактору новости - действительно ли вот это и есть то, что хочется показать народу?...

C кодом на сервере нужно, конечно, проделать много дополнительных телодвижений - stripTags для непонятных тегов, очистка понятных тегов от странного и лишнего форматирования и протчий клининг...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SickFxck
Дата 21.4.2010, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



Цитата(smartov @  20.4.2010,  10:45 Найти цитируемый пост)
Черт, подумал и понял проблему...
То есть выкусил типа
<col>BlahBlah
<tr><td>Blah2

Я до сих пор не вижу проблемы. В данном случае вы просто неправильно "откусили" вот и всё. "Кусать" надо до тех пор, пока не закроются все теги, попавшие в текст, длиной 150 символов. Да, строка может получиться длиннее 150-ти символов, но зато тут виден какой-то алгоритм.

Ещё раз спрашиваю: какой алгоритм выбрал тредстартер?

Добавлено через 3 минуты и 45 секунд
Сложнее всего ответить на вопрос: «а что вообще такое «подстрока гипертекста»? Что вообще вы хотите увидеть, попытавшись получить «150 символов таблицы»? Я смысла в этом вообще вижу мало.
PM MAIL   Вверх
smartov
Дата 21.4.2010, 21:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



Цитата(SickFxck @  21.4.2010,  21:08 Найти цитируемый пост)
надо до тех пор, пока не закроются все теги, попавшие в текст, длиной 150 символов. Да, строка может получиться длиннее 150-ти символов, но зато тут виден какой-то алгоритм.

Очень класно. Обрежем 150 символов, но не 150 символов. 
Соответствие решения техзаданию даже близко не валяется. 


Цитата(SickFxck @  21.4.2010,  21:08 Найти цитируемый пост)
Я до сих пор не вижу проблемы. 

А я вижу. Раз просят 150, надо сделать все, чтобы было максимально близко, а не делать как получится, потому что так удобнее
PM MAIL   Вверх
SickFxck
Дата 21.4.2010, 21:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



smartov, ответь на вопросы:
Цитата(SickFxck @  21.4.2010,  21:08 Найти цитируемый пост)
Сложнее всего ответить на вопрос: «а что вообще такое «подстрока гипертекста»? Что вообще вы хотите увидеть, попытавшись получить «150 символов таблицы»? Я смысла в этом вообще вижу мало. 

А уже только потом можно будет поговорить о реализации.
PM MAIL   Вверх
smartov
Дата 22.4.2010, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



SickFxck, мне задание очевидно - его бизнес логика сродни тому, почему у нас на винграде при нажатии кнопки "быстрая цитата" скрипт вставляет цитируемый текст без форматирования, а должен бы с ним. Если у тебя еще есть вопросы - задавай их ТС, а не мне.
PM MAIL   Вверх
SickFxck
Дата 22.4.2010, 07:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



Цитата(smartov @  22.4.2010,  07:17 Найти цитируемый пост)
мне задание очевидно - его бизнес логика сродни тому, почему у нас на винграде при нажатии кнопки "быстрая цитата" скрипт вставляет цитируемый текст без форматирования, а должен бы с ним

То, что ты не можешь точно описать, не существует.

Цитата(smartov @  22.4.2010,  07:17 Найти цитируемый пост)
Если у тебя еще есть вопросы - задавай их ТС, а не мне. 

Тогда просьба не оценивать чужие предложения на соответствие "техзаданию" автора:
Цитата(smartov @  21.4.2010,  21:39 Найти цитируемый пост)
Соответствие решения техзаданию даже близко не валяется. 

PM MAIL   Вверх
smartov
Дата 22.4.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



Цитата(SickFxck @  22.4.2010,  07:51 Найти цитируемый пост)
Тогда просьба не оценивать чужие предложения на соответствие "техзаданию" автора:

Согласен. Прошу прощения. Может автору действительно подходит твой алгоритм.
PM MAIL   Вверх
Gold Dragon
Дата 27.4.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Извините. был занят... Может я не совсем правильно всем объяснил... вот на примере

есть примеры следующего контекста

Код

<table>
<tr><td>Строка 1</td></tr>
<tr><td>Строка 2</td></tr>
<tr><td>Строка 3</td></tr>
<tr><td>Строка 4</td></tr>
<tr><td>Строка 5</td></tr>
<tr><td>Строка 6</td></tr>
</table>


Код

<ul>
<li>Строка 1</li>
<li>Строка 2</li>
<li>Строка 3</li>
<li>Строка 4</li>
<li>Строка 5</li>
<li>Строка 6</li>
</ul>


Код

<p>Строка 1</p>
<p>Строка 2</p>
<p>Строка 3</p>
<p>Строка 4</p>
<p>Строка 5</p>
<p>Строка 6</p>


Сам текст может иметь любые стили форматирования. И как видно, нужно не только закрывать теги, но и "научить" парсер в каком порядке их закрывать. И строка само собой получится более 150 символов.. Нужно сохранять 150 текста smile

Добавлено через 2 минуты и 48 секунд
интересный вариант предложил brother79, осталось понять логику как это реализовать


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SelenIT
Дата 27.4.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 8
Всего: 401



Если в лоб, можно попробовать тупо вырезать без учета тегов (напр., регуляркой типа '/([^<>](<[^<>]*>)*){0,150}/s'), а на результат натравить какой-нибудь tidy_repair_string (пусть сам чинит покоцаную разметку;) и из результата вырезать всё между <body>...</body>. Возможно, как вариант, вместо Tidy - DOMDocument::loadHTML (не проверял, поэтому не уверен).

Но вообще подход рискованный. Если это для новых статей/новостей, которые вводятся через WYSIWYG-редактор, лично я бы сделал как-нибудь так: для краткого содержания завел бы отдельное поле (тоже WYSIWYG'овое) и по достижении нужного лимита значением innerText.length/textContent.length основного поля копировал бы innerHTML основного поля туда яваскриптом, оставив редактору новости возможность вручную поменять его на что-то более осмысленное (напр., заменить обрезок таблицы на краткую аннотацию к ней).


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
SickFxck
Дата 27.4.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



Через стек просто делается:
Код

function htmlSubstr($html, $length)
{
    $out = '';
    $arr = preg_split('/<(.+?)>/s', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
    $tagStack = array();

    for($i = 0, $l = 0; $i < count($arr); $i++) {
        if( $i & 1 ) {

            if( $arr[$i][0] == '/' ) {
                array_pop($tagStack);
            } elseif( substr($arr[$i], -1) != '/' ) {
                array_push($tagStack, $arr[$i]);
            }

            $out .= '<' . $arr[$i] . '>';

        } else {
            
            if( ($l += strlen($arr[$i])) >= $length ) {
                $out .= substr($arr[$i], 0, $l - $length);
                break;
            } else {
                $out .= $arr[$i];
            }
     
        }
    }

    while( ($tag = array_pop($tagStack)) !== NULL )
    {
        $out .= '</' . $tag . '>';
    }

    return $out;
}

PM MAIL   Вверх
SelenIT
Дата 27.4.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 8
Всего: 401



Кстати,
Цитата(smartov @  20.4.2010,  10:45 Найти цитируемый пост)
Все теги имеют закрывающий тег. 
То, что для некоторых его можно не писать - это послабляющий фактор, но никак не мешает тебе его закрыть.

справедливо для XML (включая XHTML как application/xhtml+xml), но не для HTML (включая XHTML как text/html). В HTML для пустых (принципиально не имеющих содержимого) тегов закрывающий тег именно что запрещен. И <col> - как раз один из таких тегов;)

По сабжу, в первом приближении работает и такое:
Код

    $limit = 150;
    preg_match('/((<[^<>]*>)*(\s+|(&#?\w+;)|[^<>\s])){0,'.$limit.'}/su', $text, $m);
    $html = tidy_repair_string($m[0].'&hellip;',array(),'utf8');
    preg_match('/<body>(.*)<\/body>/isu', $html, $m);
    echo $m[1];

Закрывает всё вроде как надо (проверил на примерах из топика). Правда, нужна поддержка Tidy на сервере и кодировка utf-8 (с cp1251 у меня не получилось). И сбитые rowspan/colspan таблиц не лечит (в принципе, пустяк, таблица-то закрыта, вёрстка дальше не поплывёт)...

Это сообщение отредактировал(а) SelenIT - 27.4.2010, 17:57


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Gold Dragon
Дата 28.4.2010, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



что такое Tidy?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 28.4.2010, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



SickFxck, твой код практически отлично работает.. не пробовал на таблицах, но с другими элементами вроде пащет.. Правда <IMG> не проверил... А так всё открывается и закрывается.. 

НО(!)

- задаваемый размер не соответствует реальному тексту
- не учтено всякие специальные символы типа &laquo;

SickFxck, можешь пояснить что и как делается в коде? что-то я запутался smile

вот для примера код
Код

<?php

$s =<<<HTML
<h3>Уважаемые посетители, на <u>наших</u> страницах в апреле ... </h3>
<p align="justify">
<span style="color: #ff0000">&laquo;Професс<i>иона</i>льные ОПРОСНИКИ&raquo;</span>, кого-то они <i>направят</i> в выборе <b>профессии</b>, кому-то <b>они</b> помогут оценить возможность перемен для себя!
</p>
HTML;
$aa = htmlSubstr($s, 10);

echo $aa;
echo '<br>----------------<br>'.strlen(strip_tags($aa));

function htmlSubstr($html, $length)
{
    $out = '';
    $arr = preg_split('/<(.+?)>/s', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
    $tagStack = array();
    for($i = 0, $l = 0; $i < count($arr); $i++) {
        if( $i & 1 ) {
            if( $arr[$i][0] == '/' ) {
                array_pop($tagStack);
            } elseif( substr($arr[$i], -1) != '/' ) {
                array_push($tagStack, $arr[$i]);
            }
            $out .= '<' . $arr[$i] . '>';
        } else {
            
            if( ($l += strlen($arr[$i])) >= $length ) {
                $out .= substr($arr[$i], 0, $l - $length);
                break;
            } else {
                $out .= $arr[$i];
            }
     
        }
    }
    while( ($tag = array_pop($tagStack)) !== NULL )
    {
        $out .= '</' . $tag . '>';
    }
    return $out;
}
?>



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SickFxck
Дата 28.4.2010, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



Цитата(Gold Dragon @  28.4.2010,  08:15 Найти цитируемый пост)
- задаваемый размер не соответствует реальному тексту
- не учтено всякие специальные символы типа &laquo;

Скорее всего это одна и та же проблема.

Вечером выложу исправленный вариант, если ничего другого не найдёшь.

Добавлено через 53 секунды
А если ты работаешь с UTF-8, то там нужно mb-функции использовать.
PM MAIL   Вверх
Gold Dragon
Дата 28.4.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



SickFxck, прокомментируй код.. Хочу разобраться smile 




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.1141 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.