Регистрация    Забыли пароль?        Правила форума    FAQ (читать перед созданием новой темы)
Имя   Пароль  запомнить
  
Просмотр темы
Вернуться на сайт: PHP-Fusion SF Russian Support Site

Форум поддержки PHP-Fusion SF | SeoFusion - новое имя SF | Разработка нового фьюжена
# 1 Тема: php: форматирование текста
PahaW
SF Team

Avatar пользователя




SF Support Team

Любитель Fusion

Сообщений: 148
Зарегистрирован: 02 Июня 2009, 10:04:06
Сказали спасибо 12 раз
Статус: offline
Опубликовано 17 Июля 2009, 20:01:10
Есть простая функция нарезки строки на определенное кол-во символов:
// Trim a line of text to a preferred length
function trimlink($text, $length) {
if (strlen($text) > $length) $text = substr($text, 0, ($length-3))."...";
return $text;
}


Но есть дело в том что текст идет вместе с html тегами <a>, <b>, <i>
Как избежать подсчета этих тегов, а только текста.
То есть сделать текст коротким но с эффектом форматирования.


//текст который парсим
$html = 'g fgdf gd <a href="http://mysite.ru">Foo gdfgdf g fg df <i>gsd</i> fgds gsd fgsd gsd fg sdfg dsf"<b>"url----"</b> ---" fhgfj fh fgsdhdjfghsjdfgjsdfh jdfhdfhg dbar</a>';

$mass = array(); //массив для забивки кол-ва символов между парой тегов
$ch_last_text = array(); // массив для проверки
$sum=0; //кол-во символов
$mentka = ""; //метка на между каких тегов кол-во символов < $length - нужной длины

$substring = '.*?'; //рег выражение
$length = 30; // нужное кол-во символов

//функция подсчета кол-ва символов между тегами и добавление в массив
function my_callback_2($match){
global $mass, $length;
$lth = strlen($match[0]);
array_push($mass, $lth);
}
function my_callback_3($match){
global $mass, $ch_last_text, $length, $metka;
if (count($ch_last_text)==0){ // проверка если массив равен 0 то есть метка поставлена что найдена та часть между тегами где символов больше чем нужная нам длина
foreach ($mass as $key => $val){ //перебираем массив с нашими кол-вами символов
if (($key)==$metka) {//если наша метка совпадает с ключом в массиве тогда мы режем нашу часть текста и добавляем в массив на проверку
$text = substr($match[0], 0, ($length-3))."..."; //режем наш текст между тегами
array_push($ch_last_text, 1); //массив для проверки
}
}
} else {
$text = "";
//пошел следующий элемент и нам необходимо избавиться от остальной части просто присваиваем пустое значение
//тут стает "делема" что делать с тегами они ведь останутся??? хммм??
}
return $text;
}

$result = preg_replace_callback("/((?:^|>)[^<]*)($substring)/si", "my_callback_2", $html);


foreach($mass as $key => $val){
$sum+=settype($val, "integer");//кол-во символов
if (strlen($val) > $length) $metka = $key; //ставим метку на то между какими тегами у нас сработало условие
}

if (strlen($sum) > $length) {//а вообще весь текст больше чем длина символов вдруг там пару символов
$result = preg_replace_callback("/((?:^|>)[^<]*)($substring)/si", "my_callback_3", $html);
}
echo $result;




Даный код выдает вот это :)
<a href="http://mysite.ru"<i</i<b</b</a


[Изменил(а) PahaW, 17 Июля 2009, 20:01:41]

--------------------
-> покинул проект
^ наверх ^ paha.khspu.ru/blog
# 2  
spiker
Пользователь

Avatar пользователя



Завсегдатый

Сообщений: 63
Зарегистрирован: 02 Августа 2007, 15:04:13
Сказали спасибо 5 раз
Статус: offline
Опубликовано 17 Июля 2009, 22:05:53
А ты погугли, зачем голову то ломать.
Вот например _http://www.forum.dklab.ru/viewtopic.php?p=172025


--------------------
Попытка - не пытка...
^ наверх ^ http://www.sib-fusion.ru
# 3  
PahaW
SF Team

Avatar пользователя




SF Support Team

Любитель Fusion

Сообщений: 148
Зарегистрирован: 02 Июня 2009, 10:04:06
Сказали спасибо 12 раз
Статус: offline
Опубликовано 18 Июля 2009, 11:05:27
А ты погугли, зачем голову то ломать.
Вот например _http://www.forum.dklab.ru/viewtopic.php?p=172025

спасибо пример хороший, но накрученный надо разбираиться в нем со сплитом и величинами в длинах


--------------------
-> покинул проект
^ наверх ^ paha.khspu.ru/blog
# 4  
spiker
Пользователь

Avatar пользователя



Завсегдатый

Сообщений: 63
Зарегистрирован: 02 Августа 2007, 15:04:13
Сказали спасибо 5 раз
Статус: offline
Опубликовано 18 Июля 2009, 19:21:29
Если разберешься, вещь полезная.
Хотя "убить" html код в тексте перед его обрезкой вполне достаточно. Не будет правда переноса строк, но это и не столь важно для какой-нибудь предварительной новости.


--------------------
Попытка - не пытка...
^ наверх ^ http://www.sib-fusion.ru
# 5  
PahaW
SF Team

Avatar пользователя




SF Support Team

Любитель Fusion

Сообщений: 148
Зарегистрирован: 02 Июня 2009, 10:04:06
Сказали спасибо 12 раз
Статус: offline
Опубликовано 18 Июля 2009, 19:51:43
Я разобрался, хотя вот с метками на длины у меня все еще путаница smiley


--------------------
-> покинул проект
^ наверх ^ paha.khspu.ru/blog
Перейти на форум:


105,468,626 уникальных посетителей
сейчас: 22 Ноября 2024, 10:39:33
Генерация страницы: 0.13 сек.

Original size:22 кб.
GZipped size: 6 кб.
Compression:72%