加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Coldfusion正则表达式产生slu ..

发布时间:2020-12-14 05:49:26 所属栏目:百科 来源:网络整理
导读:我有这个函数在Coldfusion中生成slugs: cffunction name="generateSlug" output="false" returnType="string" cfargument name="str" cfargument name="spacer" default="-" cfset var ret = "" / cfset str = lCase(trim(str)) / cfset str = reReplace(st
我有这个函数在Coldfusion中生成slugs:

<cffunction name="generateSlug" output="false" returnType="string">
    <cfargument name="str">
    <cfargument name="spacer" default="-">

    <cfset var ret = "" />

    <cfset str = lCase(trim(str)) />
    <cfset str = reReplace(str,"[àáa???]","a","all") />
    <cfset str = reReplace(str,"[èéê?]","e","[ìí??]","i","[òó??]","o","[ùú?ü]","u","[?]","n","[^a-z0-9-]","#spacer#","all") />
    <cfset ret = reReplace(str,"#spacer#+","all") />

    <cfif left(ret,1) eq "#spacer#">
        <cfset ret = right(ret,len(ret)-1) />
    </cfif>
    <cfif right(ret,1) eq "#spacer#">
        <cfset ret = left(ret,len(ret)-1) />
    </cfif>

    <cfreturn ret />
</cffunction>

然后我用它调用它:

<cfset stringToBeSlugged = "This is a string abcde àáa??? èéê? ìí?? òó?? ùú?ü ? a?o ?????????????" />
<cfset slug = generateSlug(stringToBeSlugged) />
<cfoutput>#slug#</cfoutput>

但这是输出我这个slu ::

这-是-A-字符串ABCDE-A-A-A-A-A-A-E-E-E-E-I-I-I-I-O-O-O-O-U-U-U-U-N-A-NO-N-N-N-N-N-N-N-N-N-N-N-N-N

似乎所有重音字符都被正确替换了,但是这个函数在替换后插入了一个’ – ‘.为什么?

错误在哪里?

PD:我期待这个输出:

this-is-a-string-abcde-aaaaaa-eeee-iiii-oooo-uuuu-n-ano-nnnnnnnnnnnnn

谢谢.

解决方法

这对你有用吗? (我已经改编了一个我们内部使用的类似脚本.)我相信我们在ColdFusion 8中使用它,因为我们仍然使用它与CF9.

<cffunction name="generateSlug" output="false" returnType="string">
    <cfargument name="str" default="">
    <cfargument name="spacer" default="-">
    <cfset var ret = replace(arguments.str,"'","","all")>
    <cfset ret = trim(ReReplaceNoCase(ret,"<[^>]*>","ALL"))>
    <cfset ret = ReplaceList(ret,"à,á,?,?,?,?,?,è,é,ê,?,ì,í,?,?,D,?,ò,ó,?,?,?,?,ù,ú,?,ü,Y,à,á,a,?,?,?,?,è,é,ê,?,ì,í,?,?,?,ò,ó,?,?,?,?,ù,ú,?,ü,y,&nbsp;,&amp;","A,A,AE,E,I,D,N,O,U,Y,a,ae,e,i,n,o,u,y,")>
    <cfset ret = trim(rereplace(ret,"[[:punct:]]"," ","all"))>
    <cfset ret = rereplace(ret,"[[:space:]]+","!","all")>
    <cfset ret = ReReplace(ret,"[^a-zA-Z0-9!]","ALL")>
    <cfset ret = trim(rereplace(ret,"!+",arguments.Spacer,"all"))>
    <cfreturn ret>
</cffunction>

<cfset stringToBeSlugged = "This is a string abcde àáa??? èéê? ìí?? òó?? ùú?ü ? a?o ?????????????" />
<cfoutput>"#stringToBeSlugged# = #generateSlug(stringToBeSlugged)#</cfoutput>

支持更多的国际性

如果你想扩大对国际字符的支持,你可以使用ICU4J(java)和Paul Hastings的Transliterator.CFC来音译所有字符,然后用破折号替换任何剩余的空格,破折号,斜线等.

https://gist.github.com/JamoCA/ec4617b066fc4bb601f620bc93bacb57

http://site.icu-project.org/download

安装两者后,您可以通过识别语言ID(要转换为)来转换非拉丁字符并传递要转换的字符串:

<cfset Transliterator = CreateObject("component","transliterator")>

<cfoutput>
<cfloop array="#TestStrings#" index="TestString">
<h3>TestString = "#TestString#"</h3>
<blockquote>
    <div>CFC-1 = #Transliterator.transliterate('Latin-ASCII',TestString)#</div>
    <div>CFC-2 = #Transliterator.transliterate('any-NFD; [:nonspacing mark:] any-remove; any-NFC',TestString)#</div>       
</blockquote>
<hr>
</cfloop>
</cfoutput>

<h2>Available Language IDs</h2>
<cfdump var="#Transliterator.getAvailableIDs()#" label="Language IDs">

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读