str_word_count

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

str_word_count返回字符串中使用的单词信息

描述

str_word_count(string $string, int $format = 0, ?string $characters = null): array|int

计算 string 中的单词数量。如果可选的 format 未指定,则返回值将是一个整数,表示找到的单词数量。如果指定了 format,则返回值将是一个数组,其内容取决于 format。下表列出了 format 的可能值以及相应的结果输出。

就该函数而言,“单词”定义为包含字母字符的与区域设置相关的字符串,其中也可能包含但不以“'”和“-”字符开头。注意,不支持多字节区域设置。

参数

string

字符串

format

指定该函数的返回值。当前支持的值为

  • 0 - 返回找到的单词数量
  • 1 - 返回一个数组,其中包含 string 中找到的所有单词
  • 2 - 返回一个关联数组,其中键是单词在 string 中的数字位置,而值是单词本身

characters

将被视为“单词”的附加字符列表

返回值

根据所选的 format 返回一个数组或一个整数。

变更日志

版本 描述
8.0.0 characters 现在可以为空。

示例

示例 #1 一个 str_word_count() 示例

<?php

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

print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'àáãç3'));

echo
str_word_count($str);

?>

上面的示例将输出

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

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

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

7

参见

添加笔记

用户贡献的笔记 32 个笔记

cito at wikatu dot com
12 年前
<?php

/***
* 这是一个简单的 utf-8 词语计数函数(它只计数)
* 比使用 preg_match_all 的函数快一些
* 比内置的 str_word_count 慢大约 10 倍
*
* 如果你需要连字符或其他代码点作为词语字符
* 只需将它们放在 [方括号] 中,如 [^\p{L}\p{N}\'\-]
* 如果模式包含 utf-8,请对模式进行 utf8_encode(),
* 因为它应该是一个有效的 utf-8(使用 u 修饰符)。
**/

// Jonny 5 的简单词语分割器
function str_word_count_utf8($str) {
return
count(preg_split('~[^\p{L}\p{N}\']+~u',$str));
}
?>
splogamurugan at gmail dot com
15 年前
我们还可以为 charlist 指定一个值范围。

<?php
$str
= "Hello fri3nd, you're
looking good today!
look1234ing"
;
print_r(str_word_count($str, 1, '0..3'));
?>

将给出以下结果

Array ( [0] => Hello [1] => fri3nd [2] => you're [3] => looking [4] => good [5] => today [6] => look123 [7] => ing )
Adeel Khan
16 年前
<?php

/**
* 返回字符串中的单词数量。
* 就我测试而言,它非常准确。
* 字符串中可以包含 HTML,
* 但你应该先做类似以下的操作:
*
* $search = array(
* '@<script[^>]*?>.*?</script>@si',
* '@<style[^>]*?>.*?</style>@siU',
* '@<![\s\S]*?--[ \t\n\r]*>@'
* );
* $html = preg_replace($search, '', $html);
*
*/

function word_count($html) {

# 去掉所有 html 标签
$wc = strip_tags($html);

# 删除不包含字母数字字符或标点的“单词”
$pattern = "#[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]+#";
$wc = trim(preg_replace($pattern, " ", $wc));

# 删除只包含标点的单个字母“单词”
$wc = trim(preg_replace("#\s*[(\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]\s*#", " ", $wc));

# 删除多余的空白符
$wc = preg_replace("/\s\s+/", " ", $wc);

# 将字符串分割成一个包含单词的数组
$wc = explode(" ", $wc);

# 删除空元素
$wc = array_filter($wc);

# 返回单词数量
return count($wc);

}

?>
MadCoder
18 年前
以下是一个函数,它将 $string 缩减到一定数量的单词,并在末尾添加...。
(muz1 的前 100 个单词代码的扩展)

----------------------------------------------
<?php
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;
}
?>

用法
------------------------------------------------
<?php
$string
= "one two three four";
echo
trim_text($string, 3);
?>

返回值
one two three...
uri at speedy dot net
11年前
这是一个支持 UTF-8 和希伯来语的词语计数函数。我尝试过其他函数,但它们不工作。请注意,在希伯来语中, '"' 和 '\'' 可以用在词语中,所以它们不是分隔符。此函数并不完美,我更希望使用 JavaScript 中的函数,该函数将除了 [a-zA-Zא-ת0-9_\'\"] 之外的所有字符视为分隔符,但我不知道如何在 PHP 中实现它。

我删除了一些在希伯来语中不适用的分隔符("\x20", "\xA0", "\x0A", "\x0D", "\x09", "\x0B", "\x2E")。我还删除了下划线。

这是我对该页面上之前帖子的修正 - 我发现我的函数对空字符串返回了错误的结果。我修正了它,并且我还附加了另一个函数 - my_strlen。

<?php

function count_words($string) {
// 返回字符串中的词语数量。
$string= str_replace("&#039;", "'", $string);
$t= array(' ', "\t", '=', '+', '-', '*', '/', '\\', ',', '.', ';', ':', '[', ']', '{', '}', '(', ')', '<', '>', '&', '%', '$', '@', '#', '^', '!', '?', '~'); // 分隔符
$string= str_replace($t, " ", $string);
$string= trim(preg_replace("/\s+/", " ", $string));
$num= 0;
if (
my_strlen($string)>0) {
$word_array= explode(" ", $string);
$num= count($word_array);
}
return
$num;
}

function
my_strlen($s) {
// 返回使用 UTF-8 编码的 mb_strlen。
return mb_strlen($s, "UTF-8");
}

?>
brettNOSPAM at olwm dot NO_SPAM dot com
21年前
这个例子可能不美观,但它证明是准确的

<?php
// 统计词语
$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));
?>

希望我没有遗漏任何标点符号。 ;-)
brettz9 - see yahoo
14年前
除非字符列表允许,否则词语也不能以连字符结尾...
charliefrancis at gmail dot com
15 年前
嗨,这是我第一次在 php 手册上发帖,希望你们中的一些人会喜欢我写的这个小函数。

它返回一个具有特定字符限制的字符串,但仍然保留完整的词语。
它在找到一个足够短的字符串以显示时退出 foreach 循环,并且可以编辑字符列表。

<?php
function word_limiter( $text, $limit = 30, $chars = '0123456789' ) {
if(
strlen( $text ) > $limit ) {
$words = str_word_count( $text, 2, $chars );
$words = array_reverse( $words, TRUE );
foreach(
$words as $length => $word ) {
if(
$length + strlen( $word ) >= $limit ) {
array_shift( $words );
} else {
break;
}
}
$words = array_reverse( $words );
$text = implode( " ", $words ) . '&hellip;';
}
return
$text;
}

$str = "Hello this is a list of words that is too long";
echo
'1: ' . word_limiter( $str );
$str = "Hello this is a list of words";
echo
'2: ' . word_limiter( $str );
?>

1: Hello this is a list of words&hellip;
2: Hello this is a list of words
manrash at gmail dot com
15 年前
对于西班牙语使用者,有效的字符映射可能是

<?php
$characterMap
= 'áéíóúüñ';

$count = str_word_count($text, 0, $characterMap);
?>
匿名
19年前
此函数似乎将数字视为空格。例如,仅由数字组成的词语将不会被统计。
php dot net at salagir dot com
6年前
此函数无法处理重音符号,即使在使用重音符号的语言环境中也是如此。
<?php
echo str_word_count("Is working"); // =2

setlocale(LC_ALL, 'fr_FR.utf8');
echo
str_word_count("Not wôrking"); // 预计为 2,实际为 3。
?>

Cito 解决方案将标点符号视为单词,因此不是一个好的解决方法。
<?php
function str_word_count_utf8($str) {
return
count(preg_split('~[^\p{L}\p{N}\']+~u',$str));
}
echo
str_word_count_utf8("Is wôrking"); //=2
echo str_word_count_utf8("Not wôrking."); //=3
?>

我的解决方案
<?php
function str_word_count_utf8($str) {
$a = preg_split('/\W+/u', $str, -1, PREG_SPLIT_NO_EMPTY);
return
count($a);
}
echo
str_word_count_utf8("Is wôrking"); // = 2
echo str_word_count_utf8("Is wôrking! :)"); // = 2
?>
dmVuY2lAc3RyYWhvdG5pLmNvbQ== (base64)
13 年前
要统计将 msword 文档转换为纯文本(使用 antiword)后的单词数量,可以使用此函数

<?php
function count_words($text) {
$text = str_replace(str_split('|'), '', $text); // 删除这些字符(你可以指定更多)
$text = trim(preg_replace('/\s+/', ' ', $text)); // 删除多余的空格
$text = preg_replace('/-{2,}/', '', $text); // 删除连续两个或多个连字符
$len = strlen($text);

if (
0 === $len) {
return
0;
}

$words = 1;

while (
$len--) {
if (
' ' === $text[$len]) {
++
$words;
}
}

return
$words;
}
?>

它会删除管道 "|" 字符(antiword 使用这些字符来格式化其纯文本输出中的表格),删除连续两个或多个连字符(也用于表格),然后统计单词数量。

使用 explode() 和 count() 统计单词数量对于大型文本来说不是一个好主意,因为它使用大量的内存来将文本再次存储为数组。 这就是我使用 while() { .. } 来遍历字符串的原因
rcATinterfacesDOTfr
21年前
以下是另一种统计单词数量的方法
$word_count = count(preg_split('/\W+/', $text, -1, PREG_SPLIT_NO_EMPTY));
jazz090
15 年前
我个人不喜欢使用这个函数,因为有时它省略的字符对于某些情况来说是必要的,例如 MS Word 会将 ">" 或 "<" 单独计算为一个单词,而这个函数不会。 但是,我喜欢使用它,因为它会统计所有内容

<?php
function num_words($string){
preg_match_all("/\S+/", $string, $matches);
return
count($matches[0]);
}
?>
joshua dot blake at gmail dot com
17 年前
我需要一个函数,它可以从给定的输入中提取前 100 个单词,同时保留所有标记,例如换行符、双空格等等。 大多数上面发布的基于正则表达式的函数在统计 100 个单词方面是准确的,但通过将数组合并成一个字符串来重新组合段落。 这样一来,就放弃了换行符之类的任何希望,因此我设计了一个粗略但非常准确的函数,它满足了我所有的要求

<?php
function Truncate($input, $numWords)
{
if(
str_word_count($input,0)>$numWords)
{
$WordKey = str_word_count($input,1);
$PosKey = str_word_count($input,2);
reset($PosKey);
foreach(
$WordKey as $key => &$value)
{
$value=key($PosKey);
next($PosKey);
}
return
substr($input,0,$WordKey[$numWords]);
}
else {return
$input;}
}
?>

它背后的思路是? 遍历 str_word_count 返回的数组的键,并将每个单词的数量与其在短语中的字符位置相关联。 然后使用 substr 返回直到第 n 个字符的所有内容。 我已经对相当大的条目测试了这个函数,它似乎足够高效,不会造成任何停滞。

干杯!

Josh
josh at joshblake.net
17 年前
我对一个函数感兴趣,该函数可以从一个较大的字符串中返回前几个单词。

实际上,我想要一个博客条目的前 100 个单词的预览,该博客条目远远超过 100 个单词。

我发现所有其他将字符串拆分成数组并再次合并的函数都丢失了关键标记,例如换行符等等。

所以,这就是我想到的

<?php
function WordTruncate($input, $numWords) {
if(
str_word_count($input,0)>$numWords)
{
$WordKey = str_word_count($input,1);
$WordIndex = array_flip(str_word_count($input,2));
return
substr($input,0,$WordIndex[$WordKey[$numWords]]);
}
else {return
$input;}
}
?>

虽然我没有进行严格的统计,但这对于我的需求来说已经足够准确了。 如果字符串少于指定数量的单词,它也会返回整个字符串。

它背后的思路是? 使用 str_word_count 识别第 n 个单词,然后使用 str_word_count 识别该单词在字符串中的位置,然后使用 substr 提取到该位置为止的内容。

Josh。
Samer Ata
12 年前
这是我自己的版本,用于从 WordPress 文章内容中获取 SEO 元描述。 它也是一个通用的函数,用于从字符串中获取前 n 个单词。

<?php
function my_meta_description($text,$n=10)
{
$text=strip_tags($text); // 非 HTML 情况下,不必要
// $text=strip_shortcodes($text); // 仅在 WordPress 系统内取消注释
$text = trim(preg_replace("/\s+/"," ",$text));
$word_array = explode(" ", $text);
if (
count($word_array) <= $n)
return
implode(" ",$word_array);
else
{
$text='';
foreach (
$word_array as $length=>$word)
{
$text.=$word ;
if(
$length==$n) break;
else
$text.=" ";
}
}
return
$text;
?>
philip at cornado dot com
21年前
有些人问为什么不只在 ' ' 上分割,嗯,这是因为仅仅在 ' ' 上分割并不完全准确。 单词可以用制表符、换行符、双空格等分隔。 这就是为什么人们倾向于使用正则表达式在所有空格上进行分隔。
aix at lux dot ee
19年前
一个函数。
<?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;
?>
Anonymous
17 年前
这是一个 php 词语计数函数,以及一个 javascript 版本,它将打印相同的结果。

<?php
//Php 词语计数函数
function word_count($theString)
{
$char_count = strlen($theString);
$fullStr = $theString." ";
$initial_whitespace_rExp = "^[[:alnum:]]$";

$left_trimmedStr = ereg_replace($initial_whitespace_rExp,"",$fullStr);
$non_alphanumerics_rExp = "^[[:alnum:]]$";
$cleanedStr = ereg_replace($non_alphanumerics_rExp," ",$left_trimmedStr);
$splitString = explode(" ",$cleanedStr);

$word_count = count($splitString)-1;

if(
strlen($fullStr)<2)
{
$word_count=0;
}
return
$word_count;
}
?>

<?php
//Function to count words in a phrase
function wordCount(theString)
{
var
char_count = theString.length;
var
fullStr = theString + " ";
var
initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi;
var
left_trimmedStr = fullStr.replace(initial_whitespace_rExp, "");
var
non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi;
var
cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " ");
var
splitString = cleanedStr.split(" ");

var
word_count = splitString.length -1;

if (
fullStr.length <2)
{
word_count = 0;
}
return
word_count;
}
?>
broncha at rajesharma dot com
9 年前
事实证明,字符列表在 web 中是默认设置的。例如,字符串

Copyright &copy; ABC Ltd.

在 cli 中是 3 个词,在 web 上下文中执行时是 4 个词。
Kirils Solovjovs
20 年前
这些代码对我都不起作用。我认为 countwords() 对编码非常依赖。这是 win1257 的代码。对于其他布局,你只需要重新定义字母的范围...

<?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
20 年前
永远不要使用此函数来计算/分离字母数字单词,它只会将它们拆分为单词,数字拆分为数字。你可以参考另一个函数 “preg_split”,它可以用来拆分字母数字单词。它也可以处理中文汉字。
matthewkastor at live dot com
13 年前
这个函数需要改进,但目前它运行良好。

<?php
/**
* 生成文件中唯一单词的字母索引,以及它们出现的次数。
*
* 此方法适用于 html 页面或纯文本文件。
* 此函数使用 file_get_contents,因此它
* 可以使用 url 代替本地文件名。
*
* 在
* <code> $junk = preg_match('/[^a-zA-Z]/', $word); </code>
* 中更改搜索模式,如果你想要保留包含数字或其他字符的单词。我设置的模式
* 搜索任何不是大写或小写字母的字符,你可能想要其他东西。
*
* 返回的数组将类似于以下内容:
* <code>
* Array
* (
* [0] => Array
* (
* [word] => a
* [count] => 21
* )
*
* [1] => Array
* (
* [word] => ability
* [count] => 1
* )
* )
* </code>
*
* @param string $file 你要从中创建索引的文件(或 url)。
* @return array
*/
function index_page($file) {
$index = array();
$find = array(
'/\r/',
'/\n/',
'/\s\s+/'
);
$replace = array(
' ',
' ',
' '
);
$work = file_get_contents($file);
$work = preg_replace('/[>][<]/', '> <', $work);
$work = strip_tags($work);
$work = strtolower($work);
$work = preg_replace($find, $replace, $work);
$work = trim($work);
$work = explode(' ', $work);
natcasesort($work);
$i = 0;
foreach(
$work as $word) {
$word = trim($word);
$junk = preg_match('/[^a-zA-Z]/', $word);
if(
$junk == 1) {
$word = '';
}
if( (!empty(
$word)) && ($word != '') ) {
if(!isset(
$index[$i]['word'])) { // 如果没有设置,这是一个新的索引
$index[$i]['word'] = $word;
$index[$i]['count'] = 1;
} elseif(
$index[$i]['word'] == $word ) { // 计数重复
$index[$i]['count'] += 1;
} else {
// 否则,这是一个不同的单词,增加 $i 并创建一个条目
$i++;
$index[$i]['word'] = $word;
$index[$i]['count'] = 1;
}
}
}
unset(
$work);
return(
$index);
}
?>

示例用法

<?php
$file
= 'https://php.net/';
// 或使用本地文件,有关有效文件名和限制,请参见 file_get_contents()。

$index = index_page($file);
echo
'<pre>'.print_r($index,true).'</pre>';
?>
lwright at psu dot edu
17 年前
如果你想统计单词的出现频率,试试

<?php

$wordfrequency
= array_count_values( str_word_count( $string, 1) );

?>
andrea at 3site dot it
21年前
如果字符串不包含空格 " ",explode 方法不会执行任何操作,所以我写了这段代码,它似乎效果更好... 我不知道时间和资源方面怎么样

<?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;
}
?>

示例

<?php
$string
= "something:something!!something";
$count_some = str_incounter("something",$string);
// 将返回 3
?>
eanimator at yahoo dot com
15 年前
我的快速粗略的 wordLimiter 函数。

<?php
function WordLimiter($text,$limit=20){
$explode = explode(' ',$text);
$string = '';

$dots = '...';
if(
count($explode) <= $limit){
$dots = '';
}
for(
$i=0;$i<$limit;$i++){
$string .= $explode[$i]." ";
}

return
$string.$dots;
}
?>
lballard dot cat at gmail dot com
13 年前
单词限制器

<?php
$str
= "my hella long string" ;
$length = 3;
$shortened =
implode(' ',array_slice(str_word_count($str,1),0,$length));
?>
amosbatto at yahoo dot com
3 年前
// 为了获得准确的英文单词计数,一些变音符号需要
// 添加到像 née、Chloë、naïve、coöpt、façade、piñata 等词中。
$count = str_word_count($str, 0, 'éëïöçñÉËÏÖÇÑ');

// 为了获得使用罗马字母的任何欧洲语言的单词计数
$count = str_word_count($str, 0, 'äëïöüÄËÏÖÜáǽćéíĺńóŕśúźÁǼĆÉÍĹŃÓŔŚÚŹ'.
'àèìòùÀÈÌÒÙãẽĩõñũÃẼĨÕÑŨâêîôûÂÊÎÔÛăĕğĭŏœ̆ŭĂĔĞĬŎŒ̆Ŭ'.
'āēīōūĀĒĪŌŪőűŐŰąęįųĄĘĮŲåůÅŮæÆøØýÝÿŸþÞẞßđĐıIœŒ'.
'čďěľňřšťžČĎĚĽŇŘŠŤŽƒƑðÐłŁçģķļșțÇĢĶĻȘȚħĦċėġżĊĖĠŻʒƷǯǮŋŊŧŦ');
dev dot vegera at gmail dot com
3 年前
基于 preg_match_all 的函数来模仿 str_word_count 的行为

<?php
function mb_str_word_count($str, $format = 2, $charlist = '') {
if (
$format < 0 || $format > 2) {
throw new
InvalidArgumentException('Argument #2 ($format) must be a valid format value');
}
$count = preg_match_all('#[\p{L}\p{N}][\p{L}\p{N}\'' . $charlist . ']*#u', $str, $matches, $format === 2 ? PREG_OFFSET_CAPTURE : PREG_PATTERN_ORDER);
if (
$format === 0) {
return
$count;
}
$matches = $matches[0] ?? [];
if (
$format === 2) {
$result = [];
foreach (
$matches as $match) {
$result[$match[1]] = $match[0];
}
return
$result;
}
return
$matches;
}
?>
aidan at php dot net
20 年前
此功能现已在 PEAR 包 PHP_Compat 中实现。

有关在不升级 PHP 版本的情况下使用此函数的更多信息,请参阅以下链接

http://pear.php.net/package/PHP_Compat
jak74 at interia dot pl
8 年前
// 通过任意数量的逗号或空格字符拆分短语,
// 包括 " "、\r、\t、\n 和 \f

$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
print_r($keywords);
To Top