Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式将URL中的符号(&;)和空格转换为破折号(-)_Javascript_Regex - Fatal编程技术网

Javascript 使用正则表达式将URL中的符号(&;)和空格转换为破折号(-)

Javascript 使用正则表达式将URL中的符号(&;)和空格转换为破折号(-),javascript,regex,Javascript,Regex,使用下面的代码,我将以下名称转换为URL,例如 爱情与关系至http://domain.org/love-relationships 职业与指导至http://domain.org/career-guidance filter('ampToDash', function(){ return function(text){ return text ? String(text).replace(/ & /g,'-'): ''; }; }).filter('d

使用下面的代码,我将以下名称转换为URL,例如

  • 爱情与关系
    http://domain.org/love-relationships
  • 职业与指导
    http://domain.org/career-guidance

    filter('ampToDash', function(){
        return function(text){
            return text ? String(text).replace(/ & /g,'-'): '';
        };
    }).filter('dashToAmp', function(){
        return function(text){
            return text ? String(text).replace(/-/g,' & '): '';
        };
    })
    
然而,我有一套新的名字,我不知道如何同时做到这两个

  • 做人
    to
    http://domain.org/being-human
  • 竞争性考试
    http://domain.org/competitive-exams

    filter('ampToDash', function(){
        return function(text){
            return text ? String(text).replace(/ /g,'-'): '';
        };
    }).filter('dashToAmp', function(){
        return function(text){
           return text ? String(text).replace(/-/g,' '): '';
        };
    })
    

如何组合这两个正则表达式代码,使其能够协同工作?

看起来您只是想将任何带有前导或尾随空格或仅带空格的“与”的实例更改为一个连字符。如果是,可以使用以下表达式:

// Replace any strings that have leading and trailing spaces or just a series of spaces
String(text).replace(/(\s+&\s+|\s+)/g,'-'): '';
示例

var输入=[“爱情与关系”、“职业与指导”、“做人”、“竞争性考试”];
用于(输入中的var i){
变量短语=输入[i];
console.log(短语+'->'+短语.replace(/(\s+&\s+\s+)/g,'-');

}
我认为您正在寻找一种将字符串转换为slug的lib。 您可以手动执行此操作,但可能很难覆盖其他边缘情况

我建议您使用以下方法:


如果您真的想继续使用正则表达式,也可以查看以下要点:

您可能还想将替换标准扩展到涵盖所有“非单词”字符,而不是只考虑您当前知道的字符(&和空格)。这将更能证明未来,或许更容易推理:

String(text).replace(/\W+/g, '-')
\W+
表示任何非单词字符序列。)

例如:

'Jack & Jill went up the @$%#! hill'.replace(/\W+/g, '-')
收益率:

Jack-Jill-went-up-the-hill 杰克·吉尔上了山
由于信息丢失(即,通过查看转换后的字符串,您不知道究竟是什么导致了“-”,因此可以找到原始字符串的一种方法是简单地存储它并通过转换后的字符串进行查找。详细说明:您可能要从这个新字符串中查找一些文档(如其他人所指出的“slug”)。将slug与文档一起存储,只需从数据库中查找文档(及其原始标题)。

您有两个不同的问题:

  • 如何“slugify”字符串
  • 如何撤消/反转slagify
  • 回答1:通用slugify方法类似于:
    text.replace(/\W+/g,'-')


    回答2:你不能。您有一个函数(
    ampToDash
    ),可以在给定不同输入的情况下生成相同的输出。i、 e.不再有与
    dashToAmp
    等价的东西了。

    可能是
    。替换(/&|/g,“-”)
    ?我想这应该是用于
    ampToDash
    。我应该如何更改
    dashToAmp
    ?谢谢你。你是说要改变这个过程吗?它真的没有办法知道是应该把连字符转换成`&`还是只转换成空格`。你真的不能用一个通用函数来处理这两个例子的向后/向前转换,因为它不知道何时需要再次包含和。好的。我希望有一条出路!再次感谢你谢谢你。事实上我已经经历过了,但是我的问题没有解决的办法。所以不可能做到这一点?我很希望能做到。谢谢你的澄清。不,不可能。您如何知道
    职业指导
    是否应映射回
    职业指导
    职业指导
    职业指导
    职业指导
    等?在内容管理/博客平台中通常处理这种情况的方法是将生成的slug存储在数据库中,然后将URL撕成碎片,并使用slug作为数据库的查找键来查找文章内容。你不要试图从slug中反向设计文章标题。好的。非常感谢。我会和后端人员谈谈,看看解决方案。