2016-04-26 2 views
4

У меня есть эта функция для генерации слизней в Coldfusion:Coldfusion регулярное выражение для генерации слизняка

<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", "all") /> 
    <cfset str = reReplace(str, "[èéêë]", "e", "all") /> 
    <cfset str = reReplace(str, "[ìíîï]", "i", "all") /> 
    <cfset str = reReplace(str, "[òóôö]", "o", "all") /> 
    <cfset str = reReplace(str, "[ùúûü]", "u", "all") /> 
    <cfset str = reReplace(str, "[ñ]", "n", "all") /> 
    <cfset str = reReplace(str, "[^a-z0-9-]", "#spacer#", "all") /> 
    <cfset ret = reReplace(str, "#spacer#+", "#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ño ñññññññññññññ" /> 
<cfset slug = generateSlug(stringToBeSlugged) /> 
<cfoutput>#slug#</cfoutput> 

Но это выход мне этот слизняк:

это-это-строка-ABCDE-aaaaaaeeeeiiiioooouuu-уна-нет-nnnnnnnnnnnnn

кажется, что все акцентированные символы правильно заменены, но эта функция вставляет «-» после их замены. Зачем?

Где ошибка?

PD: я ожидал этого выход:

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

Спасибо.

+0

какой результат вы ожидаете от вышеуказанной функции? –

+0

затем удалите ' ' part – rock321987

+0

Я подражал вашему примеру в python, и я не думаю, что эта часть нужна, если вы ожидаете как вывод правильный – rock321987

ответ

3

Это работает для вас? (Я адаптировал похожий скрипт, который мы используем внутренне.) Я считаю, что мы использовали это с 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, "À,Á,Â,Ã,Ä,Å,Æ,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,Ø,Ù,Ú,Û,Ü,Ý,à,á,â,ã,ä,å,æ,è,é,ê,ë,ì,í,î,ï,ñ,ò,ó,ô,õ,ö,ø,ù,ú,û,ü,ý,&nbsp;,&amp;", "A,A,A,A,A,A,AE,E,E,E,E,I,I,I,I,D,N,O,O,O,O,O,0,U,U,U,U,Y,a,a,a,a,a,a,ae,e,e,e,e,i,i,i,i,n,o,o,o,o,o,0,u,u,u,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ño ñññññññññññññ" /> 
<cfoutput>"#stringToBeSlugged# = #generateSlug(stringToBeSlugged)#</cfoutput> 

Поддержка для более международного характера

Если вы хотите расширить свою поддержку международных символов, вы можете использовать ICU4J (Java) и Transliterator.CFC Paul Hastings' транслитерации всех символов и затем замените все оставшиеся пробелы, дефисы, косые черты и т. д. с помощью тире.

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

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

После установки обоих, вы можете конвертировать нелатинские символы, идентифицирующий идентификатор языка (должны быть преобразованы в) и передать строку, которая будет конвертирована:

<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"> 
+0

Отлично, его работа! – walolinux

Смежные вопросы