Page 1 sur 3

Insérer des basiles href et target= "_blank" dans un texte

Publié : mer. 11/mars/2015 10:36
par falsam
Hello tous

Code : Tout sélectionner

Procedure urlifier(Text.s)
EndProcedure

Buffer.s = "Cliques sur ce lien https://www.youtube.com/?hl=fr&gl=FR ou sur http://youtube.com"

urlifier(Buffer)
J'ai besoin de urlifier ce type de texte.

Si les rois de la boucle For ... next pouvaient m'aider en me procurant un code sans regex pour insérer des basiles href et target= "_blank"dans un texte contenant des liens, je suis preneur :)

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 11:46
par G-Rom
Salut Falsam, FindString te renvois la position d'un texte recherché , avec uniquement cette fonction tu devrais t'en sortir ?
sinon, donne un exemple de ce que attends , je ne suis pas un expert du web

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 12:18
par falsam
Bonjour G-Rom.

Voila ce que j'avais fait pour un seul lien dans une phrase

Code : Tout sélectionner

Procedure.s urlifier(UserMessage.s)
  Protected pos1, pos2, url.s, Buffer.s
  
  If UserMessage <> ""
    
    ;Cherche http: ou https: ou www.
    pos1 = FindString(UserMessage, "http:")
    If pos1 = 0
      pos1 = FindString(UserMessage, "https:")
      If pos1 = 0
        pos1 = FindString(UserMessage, "www.")
      EndIf
    EndIf
    
    If pos1
      pos2 = FindString(UserMessage, " ", pos1)
    
      If pos2 = 0 
        pos2 = Len(UserMessage)+1
      EndIf
    
      url  = Mid(UserMessage, pos1, pos2-pos1)
      
      Buffer=""
      If pos1 > 1
        Buffer = Mid(UserMessage, 1, pos1-1)
      EndIf
      
      Buffer + "<a href=" + Chr(34) + url + Chr(34) + " target="+Chr(34)+"_blank" + Chr(34)+ ">"+ url + "</a>" + Mid(UserMessage, pos2)
      
      UserMessage = Buffer    
    EndIf
  EndIf
  ProcedureReturn Buffer
EndProcedure

Buffer.s = "Cliques sur ce lien http://purebasic.com"

Debug urlifier(Buffer)
Par contre je n'arrive pas à faire la même chose quand une phrase contient plus d'un lien.

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 12:45
par Ar-S
Je ne sais pas si ça pourra t'aider mais Target _blank en html5 n'est plus d'actualité.
Pour rester dans le move, tu peux utiliser rel="external" pour ton lien en le couplant à un javascript qui lui contient le _blank. (ce que j'ai fait pour mon site).
ça marche bien.

Voilà le JS que tu appelleras dans ton entete de page

Code : Tout sélectionner

function externalLinks() {  
 if (!document.getElementsByTagName) return;  
 var anchors = document.getElementsByTagName("a");  
 for (var i=0; i<anchors.length; i++) {  
   var anchor = anchors[i];  
   if (anchor.getAttribute("href") &&  
       anchor.getAttribute("rel") == "external")  
     anchor.target = "_blank";  
 }  
}  
window.onload = externalLinks;
Ton lien se présente ensuit ainsi

Code : Tout sélectionner

<a  href="http://xxxxxx.xxx" rel="external">

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 13:09
par falsam
Mais monsieur Ar-s, c'est en PureBasic que je le souhaite. Le tchat sur lequel je travaille dessus est codé en PureBasic avec l'éditeur officiel :)

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 13:51
par falsam
@Ar-S: Le rel "external" n'est pas standardisé. il faut lui adjoindre du code JavaScript pour que ça fonctionne. je préfère du code html valide WC3.

Aide : http://www.w3schools.com/tags/att_a_rel.asp

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 14:15
par G-Rom
Tu devrais dans un premier temps extraire toutes les urls de ta phrase , une fois isolé , c'est plus pratique pour intervenir dessus et rajouté les balise html que tu veut.
tu supprimes toute les urls de ta phrase originale , et tu les remplaces par les urls modifié , voila une procédure qui extrait une url et qui sauvegarde le resultat dans une liste:

Code : Tout sélectionner

Procedure extractURL(List result.s(), string.s, startPos = 0)
  ; URL EN HTTP
  pos = FindString(LCase(string),"http",startPos)
  
  If pos <> 0
    AddElement(result())
    
    chr$ = Mid(string,pos,1)
    While chr$ <> " "
      chr$ = Mid(string,pos,1)
      pos+1
      
      result() + chr$
      
      If pos > Len(string)
        Break
      EndIf 
    Wend 
    ; on a pas fini
    If pos < Len(string)
     extractURL(result(), string, pos)
    EndIf 
  EndIf 
EndProcedure


NewList urls.s()
extractURL(urls(), " voila des liens : http://purebasic.com  ou encore : http://google.com et cerise sur le gateau ici : http://youporn.com")

ForEach urls()
  Debug urls()
Next 

Publié : mer. 11/mars/2015 14:52
par SPH
Voici le code gagnant : :mrgreen:

Code : Tout sélectionner

la$="texte : www.clubic.com et https://manga.be florence et les autres"


Repeat
ii=FindString(la$, " ", 1)
If ii=0
ch$=la$
la$=""
Else
ch$=Mid(la$,1,ii-1)
la$=Right(la$,Len(la$)-ii)
EndIf
If LCase(Left(ch$,7))="http://" Or LCase(Left(ch$,8))="https://" Or LCase(Left(ch$,4))="www."
final$+ "<a href=" + Chr(34) + ch$ + Chr(34) + " target="+Chr(34)+"_blank" + Chr(34)+ ">"+ ch$ + "</a> "
Else
final$+ch$
If la$<>""
final$+" "
EndIf
EndIf
Until la$=""


Debug final$

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 15:00
par GallyHC
Bonjour

Comme promis ma version :

Code : Tout sélectionner

Procedure.s urlscan(text.s, pos.i)
;
  Define.i i, ok, more
  
  For i=pos To Len(text)
    If Mid(text, i, 1) = " " Or Len(text) = i
      ok = i
      Break  
    EndIf
  Next i
  If ok > 0
    If ok = Len(text)
      text = ReplaceString(text, Mid(text, pos, ok - pos + 1), "<a href=" + Chr(34) + Mid(text, pos, ok - pos + 1) + Chr(34) + ">" + Mid(text, pos, ok - pos + 1) + "</a>")
    Else
      text = ReplaceString(text, Mid(text, pos, ok - pos + 1), "<a href=" + Chr(34) + Mid(text, pos, ok - pos + 1) + Chr(34) + ">" + Mid(text, pos, ok - pos + 1) + "</a> ")     
    EndIf
    ProcedureReturn text
  EndIf
  
EndProcedure

Procedure.s urlifier(text.s)
;
  Define.i urinum, uriwww, i

  urinum = CountString(text, "http:")
  urinum + CountString(text, "https:")
  If urinum = 0
    uriwww = CountString(text, "www.")
  EndIf
  If urinum > 0
    urinum = CountString(text, "http:")
    If urinum > 0
      For i=1 To urinum
        text = urlscan(text, FindString(text, "http:", i))
      Next i
    EndIf
    urinum = CountString(text, "https:")
    If urinum > 0
      For i=1 To urinum
        text = urlscan(text, FindString(text, "https:", i))
      Next i
    EndIf
  Else
    If uriwww > 0
      urinum = CountString(text, "www.")
      If urinum > 0
        For i=1 To urinum
          text = urlscan(text, FindString(text, "www.", i))
        Next i
      EndIf
    EndIf
  EndIf
  ProcedureReturn text
  
EndProcedure

Buffer.s = "Cliques sur ce lien https://www.youtube.com/?hl=fr&gl=FR ou sur http://youtube.com ou encore www.koakdesign.info"
Debug urlifier(Buffer)

Buffer.s = "Cliques sur ce lien www.koakdesign.info"
Debug urlifier(Buffer)

Cordialement,
GallyHC

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 15:08
par Marc56
falsam a écrit :sans regex
snif :cry:

J'avais préparé ça, c'est pourtant joli, rapide et facilement compréhensible :(

Code : Tout sélectionner

Buffer.s = "Clique sur ce lien https://www.youtube.com/?hl=fr&gl=FR ou sur http://youtube.com ou www.google.fr" 

CreateRegularExpression(0, "(www|https?://)([^\s]+)") 

If ExamineRegularExpression(0, Buffer)
	While NextRegularExpressionMatch(0)
		Debug "<a href=" + Chr(34) + 
		      RegularExpressionGroup(0, 1) + RegularExpressionGroup(0, 2) + Chr(34) + 
		      " target=" + Chr(34) + "_blank" + Chr(34) + ">" + 
		      RegularExpressionGroup(0, 1) + RegularExpressionGroup(0, 2) + "</a>"
	Wend
EndIf

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 17:57
par GallyHC
bonjour

SPH> c'est mieux déjà un "repeat" qu'un goto :). Et enfin il ajoute un espace en fin de ligne si le dernier est justement une url :).Mais j'adore ce type de code tellement plus simple que ma proposition.

GallyHC

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 18:13
par SPH
GallyHC a écrit :bonjour

SPH> c'est mieux déjà un "repeat" qu'un goto :). Et enfin il ajoute un espace en fin de ligne si le dernier est justement une url :).Mais j'adore ce type de code tellement plus simple que ma proposition.

GallyHC
Bien vu :wink:

Ton code est mega long ! Mais comment tu fais ? :mrgreen:

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 18:19
par GallyHC
Bonjour,

Reprise du code de SPH avec la correction du problème dit plus haut (et un peu remis en forme "j'avais besoin pour bien tout comprendre" :)):

Code : Tout sélectionner

Define i.i
Define.s stxt, result, text ="texte : http://www.clubic.com et https://manga.be florence et les autres et www.koakdesign.info"

Repeat
  i = FindString(text, " ", 1)
  If i = 0
    stxt = text
    text = #NULL$
  Else
    stxt = Mid(text, 1, i - 1)
    text = Right(text, Len(text) - i)
  EndIf
  If LCase(Left(stxt, 7)) = "http://" Or LCase(Left(stxt, 8)) = "https://" Or LCase(Left(stxt, 4)) = "www."
    If text <> #NULL$
      result + "<a href=" + Chr(34) + stxt + Chr(34) + " target=" + Chr(34) + "_blank" + Chr(34) + ">" + stxt + "</a> "
    Else  
      result + "<a href=" + Chr(34) + stxt + Chr(34) + " target=" + Chr(34) + "_blank" + Chr(34) + ">" + stxt + "</a>"
    EndIf
  Else
    result + stxt
    If text <> #NULL$
      result + " "
    EndIf
  EndIf
Until text = #NULL$


Debug "*" + result + "*"
et comment je fait c simple pas bien au vu de ton code :mrgreen:. Mais t'inquiète, il est a 100% adopté maintenant il a son petit chez lui ton code :).

GallyHC

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 18:26
par falsam
@Marc: Merci pour ta version qui tu peux me croire est celle que je préfère. Malheureusement je viens de l'essayer et c'est ce que je redoutais : Bien que le résultat est correcte avec PureBasic, ça ne fonctionne pas avec SpiderBasic et PB2Web.

@GallyHC: Merci ça fonctionne parfaitement bien avec SpiderBasic et PB2Web.

@SPH: Merci ça Fonctionne avec SpiderBasic mais pas avec PB2Web pour une raison que je n'ai pas encore analysé.

@G-Rom : Merci pour ton code. Je n'avais pas pensé à la récursivité. La méthode est simple.

Re: Insérer des basiles href et target= "_blank" dans un tex

Publié : mer. 11/mars/2015 18:29
par GallyHC
J'avais proposé aussi a la base les regex mais bon...

GallyHC