2009-06-19 5 views
2

Quelle est la plus rapide dans ColdFusion (ou Java) pour convertir une chaîne en tant que tel:Existe-t-il un meilleur moyen d'échapper à cette chaîne?

Input: 
79827349837493827498 

Output: 
\79\82\73\49\83\74\93\82\74\98 

Je prends un GUID LDAP et pour échapper à une requête.

Je peux le faire comme une série de réductions MID comme ceci:

<CFSET V1 = ""> 
    <CFSET RetVal = ""> 
    <CFLOOP CONDITION="#V1# NEQ''"> 
     <CFSET RetVal = RetVal & "\" & MID(V1,1,2)> 
     <CFSET V1 = MID(V1,3,2000)> 
    </CFLOOP> 

Mais il semble que il y aurait quelque chose de plus élégant, comme une expression régulière remplacer.

Répondre

14

Je n'ai pas testé, donc la syntaxe peut être désactivé, mais vous devriez être en mesure de faire quelque chose comme:

<cfset V1 = REReplace(V1,"([0-9]{2})","\\\1","all")> 
+0

merci. Exactement ce que je cherchais. Je viens de réaliser que mes exemples ne contenaient pas de caractères, mais LDAP Guid le fait. Donc le Regex devrait être plus proche de (\ w {2}). –

0

... Que diriez-vous

<cfset input = "79827349837493827490"> 
<cfset output = ""> 

<cfloop from="1" to="#len(input)#" index="count" step="2"> 
    <cfset output &= "\" & mid(input, count, 2)> 
</cfloop> 
2

En Java vous pourrait faire

String text = text.replaceAll("(..)","\\\1"); 
+0

Ce qui est exactement ce que vous pouvez faire dans ColdFusion. Mais je crois que c'est: .replaceAll ("(..)", "\\ $ 1") - Les références Java fonctionnent avec un signe dollar. – Tomalak

0

Je ne sais pas ColdFusion, mais voici une approche simple de Java:

private String injectBackslashes(String string) { 
    StringBuffer sb = new StringBuffer(); 
    for(int i = 0; i < string.length()/2; ++i) 
     sb.append('\\').append(string.substring(2*i, 2*i+2)); 
    return sb.toString(); 
} 
1

Voici une autre façon possible.

<cfset input = "79827349837493827498"/> 
<cfset output = input/> 

<cfloop from="#len(output)-2#" to="0" index="i" step="-2"> 
    <cfset output = insert("\",output,i)/> 
</cfloop> 

<cfoutput>#output#</cfoutput> 
+0

cool, je pensais que insert() ne fonctionnerait pas, mais en boucle fonctionne! agréable! – Henry

+0

oh ... 'to' devrait avoir 1, non? – Henry

+0

Non, 'to' doit être 0 car un paramètre de position de fonction insert() de 0 préfixe la chaîne. – Jayson

Questions connexes