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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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 :)
Dernière modification par falsam le mer. 11/mars/2015 13:27, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Dernière modification par falsam le mer. 11/mars/2015 13:46, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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">
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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 :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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 
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message 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$
Dernière modification par SPH le mer. 11/mars/2015 15:56, modifié 1 fois.

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

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

Message 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
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

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

Message 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:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Dernière modification par GallyHC le mer. 11/mars/2015 18:27, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message par GallyHC »

J'avais proposé aussi a la base les regex mais bon...

GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre