str_word_count

(PHP 4 >= 4.3.0, PHP 5)

str_word_count --  Возвращает информацию о словах, входящих в строку

Описание

mixed str_word_count ( string string [, int format] )

Подсчитывает количество слов, входящих в строку string. Если необязательный аргумент format не передан, возвращается целое число, равное количеству слов. В случае, если аргумент format передан, возвращается массив, содержимое которого зависит от значения этого аргумента. Ниже описаны допустимые значения аргумента format и соответствующие им возвращаемые значения.

  • 1 - возвращается массив, содержащий все слова, входящие в строку string.

  • 2 - возвращается массив, индексами которого являются позиции в строке, а значениями - соответствующие слова.

Эта функция считает словами последовательности алфавитных символов, возможно, включающие, но не начинающихся с "'" и "-". Набор символов, считающихся алфавитными, зависит от текущей локали.

Пример 1. Пример использования str_word_count()

<?php

$str
= "Hello friend, you're
       looking          good today!"
;

$a  = str_word_count($str, 1);
$b  = str_word_count($str, 2);
$c  = str_word_count($str);

print_r($a);
print_r($b);
echo
$c;
?>

Вывод:

Array
(
    [0] => Hello
    [1] => friend
    [2] => you're
    [3] => looking
    [4] => good
    [5] => today
)

Array
(
    [0] => Hello
    [6] => friend
    [14] => you're
    [29] => looking
    [46] => good
    [51] => today
)

6

См. также описание функций explode(), preg_split(), split(), count_chars() и substr_count().



str_word_count
rabin at rab dot in
04-Apr-2006 11:03
There is a small bug in the "trim_text" function by "webmaster at joshstmarie dot com" below. If the string's word count is lesser than or equal to $truncation, that function will cut off the last word in the string.

This fixes the problem:

<?php
function trim_text_fixed($string, $truncation = 250) {
  
$matches = preg_split("/\s+/", $string, $truncation + 1);
  
$sz = count($matches);
   if (
$sz > $truncation ) {
       unset(
$matches[$sz-1]);
       return
implode(' ',$matches);
   }
   return
$string;
}
?>
webmaster at joshstmarie dot com
28-Nov-2005 05:29
I re-examined the methods I used in my last script, as well as the other methods shown on the comments in this page. I've revised my code a great deal since then.

This new version, will limit paragraphs to a certain amount of words. It's the fastest possible way I can see of doing it... so here it is:

// Truncation is by word limit, not character limit. So if you limit
// to 255, then it will cut off a text item to 255 words, not 255 characters
function trim_text ($string, $truncation=250) {
  $string = preg_split("/\s+/",$string,($truncation+1));
  unset($string[(sizeof($string)-1)]);
  return implode(' ',$string);
}

By avoiding array_slice, it is much faster. Correcting for multiple spaces still slows it down on large text items, but it's still blazing quick in the end.
webmaster at joshstmarie dot com
25-Sep-2005 04:58
Trying to make an effiecient word splitter, and "paragraph limiter", eg, limit item text to 100, or 200 words and so-forth.

I don't know how well this compares, but it works nicely.

function trim_text($string, $word_count=100)
{
   $trimmed = "";
   $string = preg_replace("/\040+/"," ", trim($string));
   $stringc = explode(" ",$string);
   echo sizeof($stringc);
   if($word_count >= sizeof($stringc))
   {
       // nothing to do, our string is smaller than the limit.
     return $string;
   }
   elseif($word_count < sizeof($stringc))
   {
       // trim the string to the word count
       for($i=0;$i<$word_count;$i++)
       {
           $trimmed .= $stringc[$i]." ";
       }
      
       if(substr($trimmed, strlen(trim($trimmed))-1, 1) == '.')
         return trim($trimmed).'..';
       else
         return trim($trimmed).'...';
   }
}

$text = "some  test          text goes in here, I'm not sure, but ok.";
echo trim_text($text,5);
MadCoder
15-Aug-2005 09:12
Here's a function that will trim a $string down to a certian number of words, and add a...  on the end of it.
(explansion of muz1's 1st 100 words code)

----------------------------------------------
function trim_text($text, $count){
$text = str_replace("  ", " ", $text);
$string = explode(" ", $text);
for ( $wordCounter = 0; $wordCounter <= $count;wordCounter++ ){
$trimed .= $string[$wordCounter];
if ( $wordCounter < $count ){ $trimed .= " "; }
else { $trimed .= "..."; }
}
$trimed = trim($trimed);
return $trimed;
}

Usage
------------------------------------------------
$string = "one two three four";
echo trim_text($string, 3);

returns:
one two three...
jtey at uoguelph dot ca
14-Aug-2005 04:21
In the previous note, the example will only extract from the string, words separated by exactly one space.  To properly extract words from all strings, use regular expressions.

Example (extracting the first 4 words):
<?php
$string
= "One    two three      four  five six";
echo
implode(" ", array_slice(preg_split("/\s+/", $string), 0, 4));
?>

The above $string would not have otherwise worked when using the explode() method below.
jtey at uoguelph dot ca
14-Aug-2005 07:59
In reply to muz1's post below:

You can also take advantage of using other built in PHP functions to get to your final result.  Consider the following:
<?php
$string
= "One two three four five six seven eight nine ten.";
// the first n words to extract
$n = 3;
// extract the words
$words = explode(" ", $string);
// chop the words array down to the first n elements
$firstN = array_slice($words, 0, $n);
// glue the 3 elements back into a spaced sentence
$firstNAsAString = implode(" ", $firstN);
// display it
echo $firstNAsAString;
?>

Or to do it all in one line:
<?php
echo implode(" ", array_slice(explode(" ", $string), 0, $n));
?>
muz1 at muzcore dot com
12-Aug-2005 12:56
This function is awesome however I needed to display the first 100 words of a string. I am submitting this as a possible solution but also to get feedback as to whether it is the most efficient way of doing it.

<?
                                   $currString
= explode(" ", $string);
for (
$wordCounter=0; $wordCounter<100; $wordCounter++) { echo $currString[$wordCounter]." "; }
?>
16-Jan-2005 06:38
This function seems to view numbers as whitespace. I.e. a word consisting of numbers only won't be counted.
aix at lux dot ee
14-Nov-2004 02:53
One function.
<?php
if (!function_exists('word_count')) {
function
word_count($str,$n = "0"){
  
$m=strlen($str)/2;
  
$a=1;
   while (
$a<$m) {
      
$str=str_replace("  "," ",$str);
      
$a++;
       }
  
$b = explode(" ", $str);
  
$i = 0;
   foreach (
$b as $v) {
      
$i++;
       }
   if (
$n==1) return $b;
   else  return
$i;

   }
}
$str="Tere Tartu linn";
$c  = word_count($str,1); // it return an array
$d  = word_count($str); // it return int - how many words was in text
print_r($c);
echo
$d;
?>
aidan at php dot net
26-Jun-2004 03:02
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat
Kirils Solovjovs
22-Feb-2004 09:06
Nothing of this worked for me. I think countwords() is very encoding dependent. This is the code for win1257. For other layots you just need to redefine the ranges of letters...

<?php
function countwords($text){
      
$ls=0;//was it a whitespace?
      
$cc33=0;//counter
      
for($i=0;$i<strlen($text);$i++){
              
$spstat=false; //is it a number or a letter?
              
$ot=ord($text[$i]);
               if( ((
$ot>=48) && ($ot<=57)) ||  (($ot>=97) && ($ot<=122)) || (($ot>=65) && ($ot<=90)) || ($ot==170) ||
               ((
$ot>=192) && ($ot<=214)) || (($ot>=216) && ($ot<=246)) || (($ot>=248) && ($ot<=254))  )$spstat=true;
               if((
$ls==0)&&($spstat)){
                      
$ls=1;
                      
$cc33++;
               }
               if(!
$spstat)$ls=0;
       }
       return
$cc33;
}

?>
Artimis
15-Oct-2003 02:32
Never use this function to count/separate alphanumeric words, it will just split them up words to words, numbers to numbers.  You could refer to another function "preg_split" when splitting alphanumeric words.  It works with Chinese characters as well.
andrea at 3site dot it
19-May-2003 04:55
if string doesn't contain the space " ", the explode method doesn't do anything, so i've wrote this and it seems works better ... i don't know about time and resource

<?php
function str_incounter($match,$string) {
$count_match = 0;
for(
$i=0;$i<strlen($string);$i++) {
if(
strtolower(substr($string,$i,strlen($match)))==strtolower($match)) {
$count_match++;
}
}
return
$count_match;
}
?>

example

<?php
$string
= "something:something!!something";
$count_some = str_incounter("something",$string);
// will return 3
?>
megat at megat dot co dot uk
18-Apr-2003 06:29
[Ed: You'd probably want to use regular expressions if this was the case --alindeman @ php.net]

Consider what will happen in some of the above suggestions when a person puts more than one space between words. That's why it's not sufficient just to explode the string.
olivier at ultragreen dot net
11-Apr-2003 06:10
I will not discuss the accuracy of this function but one of the source codes above does this.

<?php
function wrdcnt($haystack) {
 
$cnt = explode(" ", $haystack);
 return
count($cnt) - 1;
}
?>

That could be replace by

<?php
function wrdcnt($haystack) {
 return
substr_count($haystack,' ') + 1;
}
?>

I doubt this does need to be a function :)
philip at cornado dot com
06-Apr-2003 07:30
Some ask not just split on ' ', well, it's because simply exploding on a ' ' isn't fully accurate.  Words can be separated by tabs, newlines, double spaces, etc.  This is why people tend to seperate on all whitespace with regular expressions.
rcATinterfacesDOTfr
16-Jan-2003 07:58
Here is another way to count words :
$word_count = count(preg_split('/\W+/', $text, -1, PREG_SPLIT_NO_EMPTY));
brettNOSPAM at olwm dot NO_SPAM dot com
09-Nov-2002 12:06
This example may not be pretty, but It proves accurate:

<?php
//count words
$words_to_count = strip_tags($body);
$pattern = "/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-\-|:|\&|@)]+/";
$words_to_count = preg_replace ($pattern, " ", $words_to_count);
$words_to_count = trim($words_to_count);
$total_words = count(explode(" ",$words_to_count));
?>

Hope I didn't miss any punctuation. ;-)
gorgonzola at nospam dot org
31-Oct-2002 02:48
i tried to write a wordcounter and ended up with this:

<?php
//strip html-codes or entities
$text = strip_tags(strtr($text, array_flip(get_html_translation_table(HTML_ENTITIES))));
//count the words
$wordcount = preg_match_all("#(\w+)#", $text, $match_dummy );
?>

<str_splitstrcasecmp>
 Last updated: Tue, 15 Nov 2005