PHP Conference Japan 2024

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

参见

添加备注

用户贡献的注释 30 条注释

36
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));
}
?>
16
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 )
1
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);

}

?>
1
MadCoder
19 年前
这是一个函数,可以将一个字符串$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...
0
[email protected]
12 年前
这是一个支持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");
}

?>
0
[email protected]
15 年前
对于西班牙语使用者,有效的字符映射可能是

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

$count = str_word_count($text, 0, $characterMap);
?>
0
[email protected]_SPAM.com
22年前
这个例子可能不太漂亮,但它证明是准确的

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

希望我没有错过任何标点符号。;-)
-1
brettz9 - see yahoo
14年前
除非字符列表允许,否则单词也不能以连字符结尾……
-1
[email protected]
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
-2
匿名用户
19 年前
此函数似乎将数字视为空格。即,仅由数字组成的单词不会被计算。
-2
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
?>
-2
dmVuY2lAc3RyYWhvdG5pLmNvbQ== (base64)
14年前
要计算使用 antiword 将 msword 文档转换为纯文本后单词的数量,可以使用此函数

<?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() { .. } 来遍历字符串的原因。
-1
rcATinterfacesDOTfr
21年前
这是另一种计算单词的方法
$word_count = count(preg_split('/\W+/', $text, -1, PREG_SPLIT_NO_EMPTY));
-3
jazz090
15 年前
我个人不喜欢使用此函数,因为它省略的字符有时是必要的,例如,MS Word 将“>”或“<”单独计算为单个单词,而此函数则不会。但是我喜欢使用这个,它计算一切

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

<?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
-5
josh at joshblake.net
17年前
我感兴趣的是一个函数,它可以从一个较长的字符串中返回前几个单词。

实际上,我想要一篇博客文章的前一百个单词的预览,而文章的长度远超一百个单词。

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

所以,这就是我想出来的。

<?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。
-2
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;
?>
-2
philip at cornado dot com
21年前
有些人不仅要求按空格分割,这是因为仅仅按空格分割并不完全准确。单词可以用制表符、换行符、双空格等分隔。这就是人们倾向于使用正则表达式分隔所有空格的原因。
-5
aix at lux dot ee
20年前
一个函数。
<?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); // 返回一个数组
$d = word_count($str); // 返回整数 - 文本中有多少个单词
print_r($c);
echo
$d;
?>
-4
匿名
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 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;
}
?>
-2
Kirils Solovjovs
20年前
这段代码对我无效。我认为countwords()函数非常依赖编码。这是win1257编码的代码。对于其他布局,只需重新定义字母范围即可……

<?php
function countwords($text){
$ls=0;// 是否为空格?
$cc33=0;// 计数器
for($i=0;$i<strlen($text);$i++){
$spstat=false; // 是否是数字或字母?
$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;
}

?>
-4
broncha at rajesharma dot com
9年前
事实证明,字符列表在web中是默认设置的。例如,字符串

Copyright &copy; ABC Ltd.

在命令行中是3个单词,在web环境中执行时是4个单词。
-4
Artimis
21年前
切勿使用此函数来统计/分隔字母数字单词,它只会将单词分成单词,数字分成数字。分割字母数字单词时,可以参考另一个函数“preg_split”。它也适用于汉字。
-3
matthewkastor at live dot com
13年前
这个需要改进,但目前运行良好。

<?php
/**
* 生成文件中唯一单词的字母索引及其出现次数。
*
* 此函数适用于html页面或纯文本文件。
* 此函数使用file_get_contents,因此
* 可以使用url代替本地文件名。
*
* 在
* <code> $junk = preg_match('/[^a-zA-Z]/', $word); </code>
* 中更改搜索模式,如果您想保留包含数字或其他字符的单词。我设置的模式
* 搜索任何不是大写或小写字母的内容,您可能需要其他内容。
*
* 返回的数组将类似于:
* <code>
* 数组
* (
* [0] => 数组
* (
* [word] => a
* [count] => 21
* )
*
* [1] => 数组
* (
* [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>';
?>
-5
lwright at psu dot edu
18年前
如果您想统计单词的频率,请尝试

<?php

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

?>
-3
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
?>
-5
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;
}
?>
-3
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œŒ'.
'čďěľňřšťžČĎĚĽŇŘŠŤŽƒƑðÐłŁçģķļșțÇĢĶĻȘȚħĦċėġżĊĖĠŻʒƷǯǮŋŊŧŦ');
-4
dev dot vegera at gmail dot com
4年前
基于 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;
}
?>
-5
aidan at php dot net
20年前
此功能现在已在 PEAR 包 PHP_Compat 中实现。

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

http://pear.php.net/package/PHP_Compat
To Top