【问题标题】:Javascript: how to remove punctuation from the end of a stringJavascript:如何从字符串末尾删除标点符号
【发布时间】:2017-05-14 06:41:05
【问题描述】:

免责声明:我是编程新手!我确实看过 S.O.在发布之前找到这个问题的答案,但没有找到我需要的答案。

现在,我正在使用的 API 返回一个变量:“描述”。 'description' 是一个带有标点符号的 250 个字符的动态字符串。

我必须将字符串截断为 110 个字符,然后在其后插入一个省略号。这很容易 - 我一直在使用类似的东西:

description.slice(0,110) + "..."

但上述内容是有问题的,因为我无法预测我的字符串将截断的字符。如果它在标点符号或空格处截断,结果看起来真的很傻:

我已经阅读了很多类似的查询,其中开发人员想知道如何在字符串末尾去掉一个标点符号。但我可能需要删除几个标点字符,具体取决于变量返回的标点符号或空格。

任何人都可以建议我解决此问题的最佳方法吗?如果我可以提供任何其他信息,请告诉我。

【问题讨论】:

  • 这是一个纯 CSS 的替代方案(虽然我认为它不允许您控制截断发生在哪个字符上):caniuse.com/#feat=text-overflow
  • 检查切片描述,使用 charAt (str.length-1),添加条件...如果点在末尾,添加两个点,如果不是 -> 3... 类似的东西.. ..
  • 我推荐一种不同的方法:根据单词进行拆分,并将少于 110 个字符的单词粘合起来。通过这种方式,您将确保只获得完整的单词,而不是像 long sle... 这样愚蠢的东西

标签: javascript css string slice


【解决方案1】:

我认为这会奏效!

function truncateWholeWords (text, maxLength) {
    maxLength = maxLength || 110; 
    var length = 0;

    return text.split(' ').filter(function (word) {
        length += (word.length+1);
        return length <= maxLength;
    }).join(' ').replace(/([.,\/#!$%\^&\*;:{}=\-_`~()\]\[])+$/g, "") + '...';

}

【讨论】:

    【解决方案2】:

    根据我的评论,我会以稍微不同的方式处理它,以确保完整的话。

    var string = "This is a sentence. A long sentence that should be broken up so it's not too long.  Got it?  Good.  How long. does it get?";
    
    var excerpt = createExcerpt(string);
    console.log(excerpt);
    
    // Function to parse a sentence into an excerpt, based on whole words
    function createExcerpt(string, maxLength) {
      // Set a default value of maxLength of 110
      maxLength = maxLength | 110;
      // If it's not too long, don't do anything
      if (string.length <= maxLength) {
        return string;
      }
      
      // Break it up into words
      var words = string.split(' ');
      var excerpt = '';
      // Loop over the words in order
      words.forEach(function(word) {
        // Build a test string to see if it's too long
        test = excerpt + ' ' + word;
        // If it's too long, then break out of the loop
        if (test.length > maxLength) {
          return false;
        }
    
        // Otherwise, set the excerpt to the new test string
        excerpt = test;
      });
    
      // Remove any extra spaces / dots at the end of the excerpt
      excerpt =  excerpt.replace(/[\s|\.]+$/i, '');
      // Return the excerpt with ellipses
      return excerpt + '...';
    }

    【讨论】:

      【解决方案3】:

      您可以使用修剪来删除末尾的多余空格:

      var description = description.slice(0,110).trim(); //trim to remove spaces
      

      然后添加一个条件以检查末尾是否有一个点,如果是,则添加另外两个,否则添加三个标点:

      if (description[description.length-1] === ".")
          description += '..';
      else
          description += '...';
      

      希望这会有所帮助。

      var description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
      
      description = description.slice(0,110).trim();
      
      if (description[description.length-1] === ".")
          description += '..';
      else
          description += '...';
      
      console.log(description);

      带有. 和末尾空格的片段:

      var description = "Lorem ipsum dolor sit amet,consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.  magna aliqua.";
      
      description = description.slice(0,110).trim();
      
      if (description[description.length-1] === ".")
          description += '..';
      else
          description += '...';
      
      console.log(description);

      【讨论】: