字数法

时间:2009-11-17 19:07:52

标签: javascript

我最近在javascript中为我的网站使用了修改后的字数统计方法,因此它计算了textarea中的初始数量字,但它不太有效

function wordCounter(field,countfield)
{
    var maxlimit = 200;
    var wordcounter = maxlimit - information.value.split(' ').length;
    for (x = 0; x < field.value.length; x++) 
    {
        if(field.value.charAt(x) == " " && field.value.charAt(x-1) != " ") // Counts the spaces while ignoring double spaces, usually one in between each word.
        {
            wordcounter++ 
        }

        if (wordcounter > 250) 
        {
            field.value = field.value.substring(0, x);
        }
        else
        {
            countfield.value = maxlimit - wordcounter;
        }
    }
}

7 个答案:

答案 0 :(得分:5)

给定字符串“s”,你这样做:

var numWords = s.replace(/^\s+|\s+$/g,"").split(/\s+/).length;

这会将字符串拆分为所有空格(空格,换行符等),也可以使用多个空格等。编辑:添加内联修剪以从开头/结尾去除空白。

答案 1 :(得分:4)

最简单的解决方案是计算非连续空格字符(空格,制表符等)的数量加一。

正则表达式:

\S\s

JavaScript的:

var str = "The fox jumped over the lazy dog.";
var wordcount = str.match(/\S\s/g).length + 1;

请注意,我没有使用“\ s +”,因为我不需要匹配所有空格,只需要在非空格后出现的空白字符。这有两个好处:

  1. 当字符串有许多重复的空白字符时,开销略小。
  2. 如果输入以空格开头,则不会在计数中返回额外的单词。
  3. 这里的许多答案都使用split()代替。 split()的唯一优点是不必在答案中加1,但是恕我直言,match()是更好的答案,因为代码更具可读性。代码的目的是找到单词边界,而不是分割单词。

    此外,虽然match()和split()返回数组,但match()的内存开销较小,原因有两个:

    • 少一个元素(不是什么大不了的)
    • 它只返回每个数组元素中的两个字符(可能很重要)

答案 2 :(得分:1)

简单的方法是计算空格数并加1。

编辑:添加示例

这基本上就是这样。按空格分割

var str = 'adfs asdf a asdf';
alert(str.split(/\s+/).length);

答案 3 :(得分:0)

更简单的方法是使用JavaScript RegEx to count the words

答案 4 :(得分:0)

  

x =“a b f d”;警报('x有'+   x.split(/ \ s + /)。length +'words')

答案 5 :(得分:0)

我不确定我是否理解你到底需要什么(你粘贴的代码让我感到困惑),但这里有一个简单的字数函数:

var text = "1 2 3 4000";

function wordCounter( text ) {
    word_count = text.split(" ");

    return word_count.length;
}

wordCounter( text );    // returns 4 as expected

答案 6 :(得分:0)

正则表达式中有一个分词匹配项,可让您搜索作为单词边界的任何内容,不仅搜索空格(\s),还搜索标点符号。

所以:

const wordCount = 
    'the quick,brown fox jumped over the lazy dog.'.match(/\b\w+\b/gi).length + 1

但是,它也在'处也被打断,[\w|']+也被视为边界,因此,如果要处理正撇号,也需要考虑它们,方法是剥去它们或将它们插入单词中匹配(类似using LinqKit; // nuget var customField_Ids = customFields?.Select(t => new CustomFieldKey { Id = t.Id, TicketId = t.TicketId }).ToList(); var uniqueIds1 = customField_Ids.Select(cf => cf.Id).Distinct().ToList(); var uniqueIds2 = customField_Ids.Select(cf => cf.TicketId).Distinct().ToList(); var predicate = PredicateBuilder.New<CustomFieldKey>(false); //LinqKit var lambdas = new List<Expression<Func<CustomFieldKey, bool>>>(); foreach (var cfKey in customField_Ids) { var id = uniqueIds1.Where(uid => uid == cfKey.Id).Take(1).ToList(); var ticketId = uniqueIds2.Where(uid => uid == cfKey.TicketId).Take(1).ToList(); lambdas.Add(t => id.Contains(t.Id) && ticketId.Contains(t.TicketId)); } predicate = AggregateExtensions.AggregateBalanced(lambdas.ToArray(), (expr1, expr2) => { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>()); return Expression.Lambda<Func<CustomFieldKey, bool>> (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters); }); var modifiedCustomField_Ids = repository.GetTable<CustomFieldLocal>() .Select(cf => new CustomFieldKey() { Id = cf.Id, TicketId = cf.TicketId }).Where(predicate).ToArray(); )。