Вывод определенного количества слов PHP

Beavis

Banned
kennedy
А что такое $myvaluedesc ?

-~{}~ 09.03.09 20:25:

Если ты читал описание функции, ты мог заметить что она возвращает массив слов. А то что ты не смог вывести первые 30 элементов массива - функция не виновата.

Ты свое "изобретение" проверял на реальных строках, со знаками препинания, например?)
 

kennedy

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

TutanXamoN

Новичок
kennedy
Угу) Никто) Кстати там в комментах интересные ф-ции пишут)
 

kennedy

Новичок
Вы мне просто завидуете. Но все таки я полон надежды что кто то напишет более оригинальное решение при помощи той функции которую мне предлагали. Мне интересно что именно я делал не так. Напишите а? Я же не смогу уснуть пока не узнаю.:(
 

HraKK

Мудак
Команда форума
PHP:
$text = 'ADSFASD fdsf fdsfsdf fdsfsdf fsdfsdfsdf fsdfsdf fdsffsd fdsfsdfs dfsdfasdf fdsafsdfas fsdafsdf';
$array = str_word_count($text,2);
$lenght= 50;
$result = '';
foreach ( $array as $key => $value )
{
    if($key >= $lenght)
    {
        break;
    }
    $result .= $value.' ';
}
print $result;
 

vovanium

Новичок
Что-то никто не дружит с регулярками :)
PHP:
$text = "январь\nфевраль. март\tапрель май июнь июль август сентябрь октябрь ноябрь декабрь";
// Вывод первых 30+ символов без разрыва слов
print preg_match("/^(.{30,}?)\s+/s", $text, $m) ? $m[1] . '...' : $text;
print "<br>";
// Вывод первых 5 слов
print preg_match("/^((\S+\s+){5})/s", $text, $m) ? $m[1] . '...' : $text;
 

kennedy

Новичок
вот второе решение мне нравится, но что то не верится что такая маленькая строчка будет работать :) нужно проверить. сплагиачу)

-~{}~ 09.03.09 21:56:

регулярные выражения это совсем что то не понятное. собственно вопрос, а если слов в тексте будет меньше 5 она нормально выводить будет или выдаст ошибку?
 

vovanium

Новичок
Я там немного подправил, вместо \s написал \s+ это на случай того если слова разделены несколькими пробельными символами.

-~{}~ 09.03.09 21:18:

а если слов в тексте будет меньше 5 она нормально выводить будет или выдаст ошибку?
Тогда советую почитать ;)
Если будет меньше 5 слов, то preg_match вернет false, b соответственно будет напечатан $text полностью.

В прицнипе ничего сложного
\S+ - означает один и больше непробельный символ (в непробельные символы входят не только пробелы, но и переводы строк, табуляция...)
\s+ - означает один и более пробельных символов
(\S+\s+){5} - ищет 5 соответствий шаблону в скобках
 

dimagolov

Новичок
vovanium, твоя регулярка не учитывает случая, когда там ровно 5 слов и после последнего нету пробелов
 

vovanium

Новичок
dimagolov
Почему не учитывает?
Просто выведет всю строку, без всяких изменений, там же не просто регулярка, там регулярка в условии ;)
Единственное что она не учитывает это если текст будет начинаться с пробелов (просто я обычно делаю trim текста, чтобы не было пробелов по краям)
Если допускаются пробелы вначале, то нужно еще \s* добавить или убрать ^ сначала, плюс желательно rtrim, т.е.
PHP:
$text = "    \n \t     январь\nфевраль.\tмарт апрель май июнь июль август сентябрь октябрь ноябрь декабрь";
print preg_match("/((\S+\s+){5})/s", $text, $m) ? rtrim($m[1]) . '...' : $text;
-~{}~ 10.03.09 01:17:

Да и более того с помощью регулярки легко можно настроить, чтобы к примеру тире или другие знаки препинания не считались словами
например
PHP:
$text = "регулярные выражения - это очень круто";
print preg_match("/((\S+[\s-]+){3})/s", $text, $m) ? rtrim($m[1]) . '...' : $text;
выведет "регулярные выражения - это", в то время как str_word_count посчитает тире отдельным словом
 
Сверху