12 / 12 / 6
Регистрация: 15.10.2014
Сообщений: 64
1

Вывод краткой новости

28.01.2015, 17:04. Показов 1254. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На главной странице выводится краткая новость(до 210 символов). Строка заканчивается полным словом без знаков препинания. Но при подсчёте количества символов, считаются также html теги(форматирование). В кратце это выглядит так:
PHP
1
2
3
4
5
$string= $row["news"];
$string = substr($string, 0, 210);
$string = rtrim($string, "!,.-");
$string = substr($string, 0, strrpos($string, ' '));
echo "$string";
Если добавить $string = strip_tags($string); - подсчёт символов будет правильным, но текст не будет оформлен. Можно ли как то сохранить форматирование при правильном подсчёте символов?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2015, 17:04
Ответы с готовыми решениями:

Как сделать вывод textarea вместо новости, но с ее контентом?
Есть у цикл вывода новостей из файлов и вывод ссылок для их редактирования. foreach($new_arr as...

Сделать так, чтоб под текстом новости отображались фотки соответствующей новости
есть таблица с новостями CREATE TABLE IF NOT EXISTS `news` ( `id_news` int(11) NOT NULL...

Вывод краткой новости
Помогите пожалуйста разобраться с выводом краткой новости, нужно чтобы отображалась картинка и чуть...

Вывод краткой новости (картинки)
Как сделать вывод картинок как показано на скрине (одинаковый размер, и сжимаются по центре)....

10
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
28.01.2015, 17:21 2
PHP
1
2
$string_without_tags = strip_tags($string);
... // Считаем количество символов в новой переменной.
0
12 / 12 / 6
Регистрация: 15.10.2014
Сообщений: 64
28.01.2015, 17:26  [ТС] 3
Jodah, немного не пойму куда это вставлять, чтобы сохранилось форматирование?
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
28.01.2015, 19:09 4
Dimento, туда, где вы считаете количество символов.

Примерно так:
PHP
1
2
3
4
$string = substr($row["news"], 0, 210);
$num = strlen(strip_tags($string));
echo "<p>Текст новости: $string </p>";
echo "<p>В нём $num символов </p>";
0
12 / 12 / 6
Регистрация: 15.10.2014
Сообщений: 64
28.01.2015, 19:28  [ТС] 5
Jodah, в новости я выбираю первые 210 символов текста. Если я буду выбирать эти 210 из строки без html символов, я не смогу вывести её с форматированием.

Добавлено через 5 минут
К примеру, выбираем первые 10 символов
В базе данных код такой: <a href="ссылка">Ляляля</a>папапап
если применять strip_tags, вывод на странице будет такой: Ляляляпапа
а мне нужно, чтобы часть Ляляля оставалась ссылкой (т.е сохраняла форматирование текста)
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
28.01.2015, 19:39 6
Dimento, так я это и сделал. В переменной $string лежит текст с HTML разметкой.
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
28.01.2015, 19:52 7
Цитата Сообщение от Jodah Посмотреть сообщение
Dimento, так я это и сделал. В переменной $string лежит текст с HTML разметкой.
Нет. Решение несколько сложнее. Будет время вечером напишу.
0
12 / 12 / 6
Регистрация: 15.10.2014
Сообщений: 64
28.01.2015, 19:58  [ТС] 8
Jodah, всё равно не могу понять. Можете полную версию показать? В этой у вас из $string берется 210 символов включая символы тегов. И при выводе мы получим не 210, а меньше(за вычетом тегов).
0
368 / 406 / 165
Регистрация: 29.05.2014
Сообщений: 1,494
28.01.2015, 20:57 9
Даже писать не пришлось в закладках лежало.
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function substr_html($string, $length)
    {
        $count = 0;
        $state = 2;
        for ($i = 0; $i < strlen($string); $i++) {
            $char = $string[$i];
            if ($char == '<') {
                $state = 1;
            } else if ($char == '&') {
                $state = 2;
                $count++;
            } else if ($char == ';') {
                $state = 0;
            } else if ($char == '>') {
                $state = 0;
            } else if ($state === 0) {
                $count++;
            }
 
            if ($count === $length) {
                return substr($string, 0, $i + 1);
            }
        }
        return $string;
    }
 
echo substr_html($str, 210);// на вход подать строку с тэгами и число символов на вывод
1
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
28.01.2015, 21:25 10
Dimento, А-а, понял, 210 символов без учёта тегов. Извиняюсь, неправильно понял условие.
Вижу, BarbosLV уже предложил решение.
0
12 / 12 / 6
Регистрация: 15.10.2014
Сообщений: 64
29.01.2015, 13:19  [ТС] 11
BarbosLV, работает, спасибо)
Только есть вопрос, у меня данные в цикле выводятся. Функцию нужно до неё ставить, а где ставить вот эти строки, чтобы не заканчивалось на знаки препинания или пробел?
PHP
1
2
$string = rtrim($string, "!,.-");
$string = substr($string, 0, strrpos($string, ' '));
Добавлено через 9 часов 53 минуты
Не правильно работает функция... последнюю новость оно нормально взяло, а в предыдущей больше 280+ символов.

Добавлено через 4 часа 43 минуты
Нашел вот такое решение, которое работает:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
function truncateHtml($text, $length = 210, $ending = '...', $exact = false, $considerHtml = true) {
    if ($considerHtml) {
        // if the plain text is shorter than the maximum length, return the whole text
        if (strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
            return $text;
        }
        // splits all html-tags to scanable lines
        preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER);
        $total_length = strlen($ending);
        $open_tags = array();
        $truncate = '';
        foreach ($lines as $line_matchings) {
            // if there is any html-tag in this line, handle it and add it (uncounted) to the output
            if (!empty($line_matchings[1])) {
                // if it's an "empty element" with or without xhtml-conform closing slash
                if (preg_match('/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1])) {
                    // do nothing
                // if tag is a closing tag
                } else if (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) {
                    // delete tag from $open_tags list
                    $pos = array_search($tag_matchings[1], $open_tags);
                    if ($pos !== false) {
                    unset($open_tags[$pos]);
                    }
                // if tag is an opening tag
                } else if (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) {
                    // add tag to the beginning of $open_tags list
                    array_unshift($open_tags, strtolower($tag_matchings[1]));
                }
                // add html-tag to $truncate'd text
                $truncate .= $line_matchings[1];
            }
            // calculate the length of the plain text part of the line; handle entities as one character
            $content_length = strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', ' ', $line_matchings[2]));
            if ($total_length+$content_length> $length) {
                // the number of characters which are left
                $left = $length - $total_length;
                $entities_length = 0;
                // search for html entities
                if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|[0-9a-f]{1,6};/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE)) {
                    // calculate the real length of all entities in the legal range
                    foreach ($entities[0] as $entity) {
                        if ($entity[1]+1-$entities_length <= $left) {
                            $left--;
                            $entities_length += strlen($entity[0]);
                        } else {
                            // no more characters left
                            break;
                        }
                    }
                }
                $truncate .= substr($line_matchings[2], 0, $left+$entities_length);
                // maximum lenght is reached, so get off the loop
                break;
            } else {
                $truncate .= $line_matchings[2];
                $total_length += $content_length;
            }
            // if the maximum length is reached, get off the loop
            if($total_length>= $length) {
                break;
            }
        }
    } else {
        if (strlen($text) <= $length) {
            return $text;
        } else {
            $truncate = substr($text, 0, $length - strlen($ending));
        }
    }
    // if the words shouldn't be cut in the middle...
    if (!$exact) {
        // ...search the last occurance of a space...
        $spacepos = strrpos($truncate, ' ');
        if (isset($spacepos)) {
            // ...and cut the text in this position
            $truncate = substr($truncate, 0, $spacepos);
        }
    }
    // add the defined ending to the text
    $truncate .= $ending;
    if($considerHtml) {
        // close all unclosed html-tags
        foreach ($open_tags as $tag) {
            $truncate .= '</' . $tag . '>';
        }
    }
    return $truncate;
}
echo truncateHtml($row["news"]);
Только не знаю как сделать так, чтобы по окончанию обрезания строки убрать из конца все знаки препинания и пробелы

Добавлено через 15 минут
Подправил, теперь делает всё как нужно.
PHP
1
2
3
4
$string = truncateHtml($row["news"]);
$string = rtrim($string, "!,.-");
$string = substr($string, 0, strrpos($string, ' '));
echo $string."...";
Только есть лишнее добавление $ending = '...' в начале функции(которое впринципе потом вырезается), хотелось бы как-то от него избавиться, но не представляю как.
0
29.01.2015, 13:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2015, 13:19
Помогаю со студенческими работами здесь

Подвал краткой новости
Хочу что бы вместо категории у краткой новости выводилась цена. Categories: Лодки | Comments -...

Форматирование краткой новости на Bloggie
Здравствуйте. Есть проблема, в краткой новости, форматирование режется, а мне хочется , чтобы...

Не применяется шаблон к краткой новости
Доброго времени суток Форумчане! Столкнулся с проблемой, никак не могу решить .... Создал блок на...

Некорректный код в краткой новости
Здравствуйте. Скинул себе шаблон на сайт под управлением DLE (пока на Denwer) Хочу допилить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru