15

我想计算特定字符串中的单词,以便我可以验证它并防止用户写超过例如 100 个单词。

我写了这个函数,但我认为它不够有效。我使用了以空格作为分隔符的explode 函数,但是如果用户放置两个空格而不是一个呢?你能给我一个更好的方法吗?

function isValidLength($text , $length){
  
   $text  = explode(" " , $text );
   if(count($text) > $length)
          return false;
   else
          return true;
}
4

10 回答 10

25

也许str_word_count可以帮助

http://php.net/manual/en/function.str-word-count.php

$Tag  = 'My Name is Gaurav'; 
$word = str_word_count($Tag);
echo $word;
于 2011-01-24T20:30:18.077 回答
20

尝试这个:

function get_num_of_words($string) {
    $string = preg_replace('/\s+/', ' ', trim($string));
    $words = explode(" ", $string);
    return count($words);
}

$str = "Lorem ipsum dolor sit amet";
echo get_num_of_words($str);

这将输出:5

于 2012-12-23T11:43:11.313 回答
10

您可以使用内置的 PHP 函数str_word_count。像这样使用它:

$str = "This is my simple string.";
echo str_word_count($str);

这将输出 5。

如果您打算在任何单词中使用特殊字符,则可以提供任何额外的字符作为第三个参数。

$str = "This weather is like el ninã.";
echo str_word_count($str, 0, 'àáã');

这将输出 6。

于 2011-01-24T20:30:41.153 回答
4

str_count_words 有他的缺点。它会将下划线视为分隔的单词,例如 this_is 两个单词:

您可以使用下一个函数来计算由空格分隔的单词,即使它们之间有多个单词。

function count_words($str){

    while (substr_count($str, "  ")>0){
        $str = str_replace("  ", " ", $str);
    }
    return substr_count($str, " ")+1;
}


$str = "This   is  a sample_test";

echo $str;
echo count_words($str);
//This will return 4 words;
于 2012-09-20T06:43:07.130 回答
4

此函数使用简单的正则表达式将输入 $text 拆分为任何非字母字符:

function isValidLength($text, $length) {
    $words = preg_split('#\PL+#u', $text, -1, PREG_SPLIT_NO_EMPTY);
    return count($words) <= $length;
}

这确保了它与由多个空格或任何其他非字母字符分隔的单词正常工作。它还可以正确处理 unicode(例如重音字母)。

当字数小于 $length 时,该函数返回 true。

于 2011-01-24T20:30:21.027 回答
2

使用 preg_split() 而不是 explode()。Split 支持正则表达式。

于 2011-01-24T20:29:59.263 回答
0

使用substr_count计算任何子字符串出现的次数。要查找单词数,请将 $needle 设置为 ' '。int substr_count ( 字符串 $haystack , 字符串 $needle)

$text = 'This is a test';
echo substr_count($text, 'is'); // 2


echo substr_count($text, ' ');// return number of occurance of words
于 2011-04-09T14:50:50.417 回答
0

n 个对象之间有 n-1 个空格,因此 100 个单词之间将有 99 个空格,因此您可以选择一个单词的平均长度,例如 10 个字符,然后乘以 100(对于 100 个单词)然后加上 99(空格)那么您可以改为根据字符数(1099)进行限制。

function isValidLength($text){

如果(strlen($文本)> 1099)

     return false;

否则返回真;

}

于 2016-03-09T14:29:10.630 回答
0

如果您需要更强大的实用程序来在应用程序的上下文中定义“单词”,则调用 会preg_match_all()返回其匹配计数。如果您需要多字节支持,请添加 unicode 模式修饰符。\pL并且\pM是在包容性方面犯错的字母和字母标记。考虑这是一个起点,并了解“单词”的正则表达式规则可以根据需要收紧或放宽。

此解决方案是多字节安全的。

代码:(演示)(Regex101演示

function isValidLength($text, $length) {
    return $length <= preg_match_all("~[\pL\pM'-]+~u", $text);
}

或者,如果它是必填字段并且您只需要计算以空格分隔的“非空白子字符串”,那么您可以只写:

if (preg_match("~^\s*\S+(\s+\S+){0,99}\s*$~", $text)) { ... }

或者

if (preg_match("~^\S+(\s+\S+){0,99}$~", trim($text))) { ... }
于 2021-09-17T01:54:33.063 回答
0

我写了一个更好的函数,str_word_count因为 PHP 函数将破折号和其他字符计为单词。

我的函数还解决了双空格的问题,其他人编写的许多函数都没有考虑到这个问题。

这个函数也处理 HTML 标签。如果您将两个标签嵌套在一起并简单地使用该strip_tags功能,那么当它是两个时,这将被视为一个单词。例如:<h1>Title</h1>Text<h1>Title</h1><p>Text</p>

此外,我首先去掉了 JavaScript,否则标记中的<script>代码将被视为单词。

最后,我的函数处理字符串开头和结尾的空格、多个空格和换行符、返回字符和制表符。

###############
# Count Words #
###############
function count_words($str)
{
 $str = preg_replace("/[^A-Za-z0-9 ]/","",strip_tags(str_replace('<',' <',str_replace('>','> ',str_replace(array("\n","\r","\t"),' ',preg_replace('~<\s*\bscript\b[^>]*>(.*?)<\s*\/\s*script\s*>~is','',$str))))));
 while(substr_count($str,'  ')>0)
 {
  $str = str_replace('  ',' ',$str);
 }
 return substr_count(trim($str,' '),' ')+1;
}
于 2016-05-20T17:00:38.367 回答