【问题标题】:Truncate words function in javascript (studying dojo's code)javascript中截断单词的功能(学习dojo的代码)
【发布时间】:2009-06-09 19:47:21
【问题描述】:

“截断单词”将获取一串单词并仅返回第一个单词,比如说 10 个单词。

在dojo(javascript库)中他们有这样一个功能,其代码是这样的:

truncatewords: function(value, arg){
    // summary: Truncates a string after a certain number of words
   // arg: Integer
   //              Number of words to truncate after
   arg = parseInt(arg);
   if(!arg){
           return value;
   }

   for(var i = 0, j = value.length, count = 0, current, last; i < value.length; i++){
           current = value.charAt(i);
           if(dojox.dtl.filter.strings._truncatewords.test(last)){
                   if(!dojox.dtl.filter.strings._truncatewords.test(current)){
                           ++count;
                           if(count == arg){
                                   return value.substring(0, j + 1);
                           }
                   }
           }else if(!dojox.dtl.filter.strings._truncatewords.test(current)){
                   j = i;
           }
           last = current;
   }
   return value;
}

其中dojox.dtl.filter.strings._truncatewords./(&amp;.*?;|&lt;.*?&gt;|(\w[\w-]*))/g

为什么不是这样写的:

function truncate(value,arg) {
    var value_arr = value.split(' ');
    if(arg < value_arr.length) {
        value = value_arr.slice(0,arg).join(' '); }
    return value;
}

又有什么区别?

【问题讨论】:

    标签: javascript string truncate


    【解决方案1】:

    您的拆分应考虑到任何空白字符序列都是单词分隔符。您应该拆分像\s+ 这样的正则表达式。

    但除此之外,dojo 的代码似乎也将实体和 xml 标签作为单词。如果你知道你的字符串中没有这样的东西,你的实现可能会成功。请注意,您的切片不会超出找到的单词数,这可能需要稍作检查。

    【讨论】:

      【解决方案2】:

      您正在查看的代码来自 dtl 库,该库用于支持 django 模板语言。 (http://www.dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-dtl)。我确信其中的代码不仅仅是为了进行直接的字符串拆分,而是解析他们正在使用的模板。

      另外,看看那个正则表达式,他们处理的场景不仅仅是空格......例如, <.> 将导致包含在开始和结束标签中的任何单词组被视为“词”。

      【讨论】:

      • 是的,我还在开发用于 javascript 的 django 模板端口,我认为 dojo 的 dtl 是获得一些想法和一些代码的好地方。我很惊讶(困惑?)为什么 html/xml 标签会被视为单词。通常当我截断一个字符串时,是因为我想显示一个带有更多..链接的摘要,不是吗?
      • 我不知道他们是如何使用那里的代码的……为了您的目的,当然,这是有道理的。但由于正则表达式包含它们,我猜它是有效的。也许它只是为了在某种模板预览中显示模板的前 X 个单词?如果不花更多时间在那里,我不确定。如果您发布到道场邮件列表,我相信他们可以帮助您。
      【解决方案3】:
      1. function 声明:这可能是一个 javascript 对象,使用 function_name: function(params) {... 有助于将 javascript 排除在全局范围之外。
      2. 通过检查arg 变量,他们确保传递了一个整数。使用parseInt() 将允许10"10" 被接受。
      3. 此方法可以处理比使用的正则表达式更多的分隔符。
      4. 此代码对于数组溢出是安全的。如果value 中只有 8 个单词,则不能数到 10。否则,您会得到数组越界或对象不存在错误。

      【讨论】:

        【解决方案4】:

        正则表达式是 3 部分

        1. &.*?;将匹配字符实体(如 &)
        2. <.> 将匹配尖括号中的内容
        3. (\w[\w-]*) 将匹配以 [a-zA-Z0-9_] 开头的字符串,后跟一个破折号

        这不仅仅是空间分割。它正在寻找它认为可能是一个单词的一部分的东西,一旦它找到不是的东西,它就会增加字数。

        它应该采用逗号或竖线分隔的列表,并且与空格分隔的列表一样有效。

        【讨论】:

        • 阅读了您的评论和上面的 cmets,我尝试使用 dojo 的正则表达式来获得更好的解决方案。问题是如果字符串是用非拉丁字符编写的,你就不能用 dojo 截断。 (正如你所说, \w 只会匹配 a-zA-Z 字符)。所以我的新方法是: ... var value_arr = value.match(/(.+?([^\-](?=\s|,)))/g); if(value_arr && length
        猜你喜欢
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多