角度slugify在最后留下破折号

时间:2015-07-24 23:47:48

标签: angularjs

删除重音和符号slugify,但最后留下短划线。

我也会在控制器之间共享相同的功能,怎么做?

代码:

$scope.slugify = function(slug){
    str = slug.replace("-");
    str = angular.lowercase(str);
    str = str.replace(/[^A-Z0-9]+/ig, "-");        
    $scope.item.slug = str;
}

示例:

来源:内马尔是最好的球员!

 return: neymar-the-best-player-

[解决]

我发现了这个:https://github.com/paulsmith/angular-slugify

2 个答案:

答案 0 :(得分:1)

要公开它,有一个必要的步骤来返回一些东西。然后你可以把它包装成list并注入任何控制器。

constant

同样从函数应用的转换的性质来看,它符合app.controller('MainCtrl', function($scope, slugify) { $scope.show = function(){ alert(slugify($scope.someText)); } }); app.constant('slugify', function(slug){ str = slug.replace("-"); str = angular.lowercase(str); str = str.replace(/[^A-Z0-9]+/ig, "-"); return str; });

的模式
filter

在模板中使用这样的

app.filter('slugifyFilter', function(){
  return function(slug){
    str = slug.replace("-");
    str = angular.lowercase(str);
    str = str.replace(/[^A-Z0-9]+/ig, "-");        
    return  str;
  }
});

plunker

中查看此操作

答案 1 :(得分:1)

主要问题:

  

删除重音和符号slugify,但在最后留下短划线

在我们讨论主要问题之前,您需要修补几部分代码。

  1. 第一个replace()语句适用于任何其他字符串之间的破折号,但如果破折号放在字符串的两端,肯定会出现问题。
  2. e.g。 '-Some-Text-'结果为'undefinedSome-Textundefined'

    要解决此问题,您需要为replace()添加一个空字符串的第二个参数。

    自:

    str = slug.replace("-");
    

    要:

    str = slug.replace('-', '');
    
    1. 第二个replace()语句有一个正则表达式标志,表示i,表示不区分大小写的搜索。虽然您的正则表达式语句建议使用A-Z(大写表达式),但这实际上是多余的,因为您已经将字符串修改为小写。所以声明应该改变:
    2. 自:

      str = str.replace(/[^A-Z0-9]+/ig, "-");
      

      要:

      str = str.replace(/[^a-z0-9]+/g, "-");
      
      1. 现在针对主要问题,您只是错过了字符串两端的破折号修剪功能。
      2. 在#2

        中的代码之后添加此替换语句
        str = str.replace(/^-+|-+$/g, '');
        

        从我在你的代码中看到的,这似乎更像是一个可重用的函数,而不是一个可以归结为控制器函数的东西。您可以为此特定功能创建服务,并将其注入控制器。

        <强> DEMO

          .controller('SluggerController', function($scope, slugify) {
        
            $scope.slug = 'Neymar the best player!';
            $scope.item = { slug: '' };
        
            $scope.slugify = function(slug) {
              $scope.item.slug = slugify(slug);
            };
        
          })
        
          .factory('slugify', function() {
            return function(text) {
              return angular.lowercase(text)
                .replace('-', '')
                .replace(/[^a-z0-9]+/g, '-')
                .replace(/^-+|-+$/g, '');
            };
          });
        

        <强>更新

        由于您不希望将unicode字符包含为虚线字符,因此您可以将其与#2合并。

        <强> DEMO

        而不是:

        str = str.replace(/[^a-z0-9]+/g, "-");
        

        将其更改为:

        str = str.replace(/[^\u00BF-\u1FFF\u2C00-\uD7FF\w0-9]/g, '-');
        

        至于我如何获得正则表达式,您可以参考 SO comment