【问题标题】:Validate that input string does not exceed word limit如何计算PHP中特定字符串中的单词?
【发布时间】:2011-06-14 18:44:58
【问题描述】:

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

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

function isValidLength($text , $length){

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

【问题讨论】:

标签: php string validation explode


【解决方案1】:

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

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

代码:(Demo) (Regex101 Demo)

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

【讨论】:

    【解决方案2】:

    也许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;
    

    【讨论】:

    • 只有另一个人提到了str_word_count。不合适吗?
    • str_word_count 不好!如果它包含在“theme”“theory”等更大的词中,它会多次计算“the”。str_word_count 很烂,我在 stackoverflow 上看到了它
    • @giorgio79 提供替代方案而不是像疯子一样咆哮。
    • 此函数还将连字符视为单词。在使用 preg_replace 替换所有非字母字符后,我发现使用此函数更好,例如: str_word_count(preg_replace('/[^a-z]+/i', ' ', $string))
    • str_word_count 会将“Yet”和“yet”视为两个不同的词。我猜这很公平。这可以通过在测试之前将字符串下套管来解决。
    【解决方案3】:

    我写了一个比str_word_count更好的函数,因为那个PHP函数把破折号和其他字符算作单词。

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

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

    另外,我首先去掉了 JavaScript,否则 &lt;script&gt; 标记中的代码将被视为单词。

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

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

    【讨论】:

      【解决方案4】:

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

      function isValidLength($text){
      

      如果(strlen($text) > 1099)

           return false;
      

      否则 返回真;

      }

      【讨论】:

        【解决方案5】:

        试试这个:

        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

        【讨论】:

        • 这实际上是迄今为止最好的答案,既简洁又没有某种严重的问题。但我会将函数体简化为return count(explode(' ', preg_replace('/\s+/', ' ', trim($string))));
        【解决方案6】:

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

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

        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;
        

        【讨论】:

          【解决方案7】:

          使用 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
          

          【讨论】:

          • 这有一些问题。它计算空格,而不是单词。因此,如果有一个单词,它将返回 0。它会将多个空格计为单词(例如,如果您像通常那样在每个句点后放置两个空格)。
          【解决方案8】:

          您可以使用内置的 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。

          【讨论】:

          • @Blender:PHP 真是太棒了。您想要的只是在标准库中。只是这个小makeBlog() 功能仍然缺失。
          • @Michael Irigoyen:他的意思可能是“为什么 PHP 有这么多功能?”在修辞意义上。
          • 此功能不适用于非 ascii 字符(例如重音字母)。 str_word_count("déjà") 输出 2。
          • @user576875: a) 它依赖于语言环境,b) 你可以指定更多的“单词”字符。
          • @nikic LC_ALL=fr_FR.UTF-8,仍然输出2 :) $charlist 参数不适用于多字节字符。
          【解决方案9】:

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

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

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

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

          【讨论】:

            【解决方案10】:

            使用 preg_split() 代替 explode()。 Split 支持正则表达式。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-04-10
              • 2021-03-10
              • 1970-01-01
              • 2020-11-18
              • 1970-01-01
              • 1970-01-01
              • 2023-03-21
              相关资源
              最近更新 更多