2010-04-12 2 views
2

Je suis en train de changer les instances de la ligne suivante:En utilisant URLEncodedFormat avec REReplace

URL: http://www.google.com/?s= test 

à

URL: <a href="http://www.google.com/?s=%20test">http://www.google.com/?s= test</a> 

Notez que l'URL d'ancrage est codé url

J'ai réussi pour obtenir l'analyse de la partie URL en utilisant une regex très simple:

<cfset getFacts.fact_details = REReplace(getFacts.fact_details, 
"URL:[ ]*([^#chr(13)##chr(10)#]+)", 
"URL: <a href='\1' target='_blank'>\1</a>", "ALL")><!--- URL to newline into link ---> 

qui saisit juste le contenu après le "URL:" jusqu'à une nouvelle ligne

Comment puis-je incorporer URLEncodedFormat avec ceci, ou utiliser toute regex?

Répondre

4

Vous devrez le faire dans des étapes distinctes, car vous ne pouvez pas utiliser les appels de fonction dans un RegEx.

D'abord, obtenez l'emplacement de l'URL en utilisant REFind. Vous avez déjà l'expression régulière pour cela.

Maintenant, utilisez mid() pour récupérer uniquement l'URL. Stockez ceci dans une variable pour la manipulation. Supprimez l'URL: part, puis effectuez votre appel URLEncodedFormat(). Je stockerais ceci dans une variable séparée, de sorte que vous puissiez afficher l'URL telle qu'elle a été saisie à l'origine. Utilisez ces deux variables pour créer votre chaîne de remplacement (lien).

Maintenant, vous pouvez créer votre résultat en utilisant left() et right() pour extraire ce qui vient avant et après votre URL et en insérant la chaîne de remplacement entre eux.

Un peu comme un PITA, mais il est là.

+0

merci! Je cherchais une solution rapide et facile, supposez qu'il n'y en a pas: < – davidosomething

+0

Beaucoup de gens demandent des variations à cause de la limitation d'appel de la fonction. Le problème est que CF ne gère pas RegEx nativement. Il passe au moteur Java RegEx. Donc, vous finissez par faire les étapes intermédiaires vous-même. –

0

Pourquoi utiliser regex? Il y a de bonnes fonctions de liste qui sont parfaitement à la hauteur du travail.

<cfoutput> 
    <cfset BrokenUrl = "http://www.google.com/?s= test&f=%20foo%20&g&g/=/"> 
    <cfset FixedUrl = FixUnencodedUrl(BrokenUrl)> 
    #HTMLEditFormat(FixedUrl)# 
    <!--- prints: http://www.google.com/?s=%20test&f=%20foo%20&g=&g%2F=%2F ---> 
</cfoutput> 

<cffunction name="FixUnencodedUrl" returntype="string" access="public"> 
    <cfargument name="UrlStr" type="string" required="yes"> 

    <cfset var UrlPath = ListFirst(UrlStr, "?")> 
    <cfset var UrlQuery = ListRest(UrlStr, "?")> 
    <cfset var NewQuery = ""> 
    <cfset var part  = ""> 
    <cfset var name  = ""> 
    <cfset var value = ""> 

    <cfloop list="#UrlQuery#" index="part" delimiters="&"> 
    <cfset name = ListFirst(part, "=")> 
    <cfset value = ListRest(part, "=")> 
    <!--- only encode if not already encoded ---> 
    <cfif name eq URLDecode(name)> 
     <cfset name = URLEncodedFormat(name)> 
    </cfif> 
    <cfif value eq URLDecode(value)> 
     <cfset value = URLEncodedFormat(value)> 
    </cfif> 
    <!--- build new, encoded query string ---> 
    <cfset NewQuery = ListAppend(NewQuery, "#name#=#value#", "&")> 
    </cfloop> 

    <cfreturn ListAppend(UrlPath, NewQuery, "?")> 
</cffunction> 
+0

Je tire du texte d'un champ nvarchar dans une base de données qui contient quelque chose comme ---- Text1: Du texte du texte \ nText2: Du texte du textURL: http://goodurl.com/\nText3: Du texte du texte \ nURL: http://badurl.com/?s= testing \ nText4: Du texte avec du texte ---- donc vous voyez pourquoi cela ne fonctionnerait pas sans une analyse encore plus intense. – davidosomething

+0

@davidosomething: D'accord, je vois. Vous pouvez toujours utiliser la fonction ci-dessus avec votre regex pour trouver des URL. Il n'encadre pas les bonnes URL, donc vous pouvez aussi lui envoyer des URLs non cassées. – Tomalak