Page 1 sur 2

Exemples d'utilisation des expressions régulières

Publié : dim. 24/févr./2008 1:30
par erix14
Voici deux exemples d'utilisation des expressions régulières.
Récupération des adresses mail dans un texte :

Code : Tout sélectionner

If CreateRegularExpression(0, "[a-zA-Z0-9\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z]+")
	Dim result$(0)
	Debug "Extraire les adresses email d'un texte :"
	MaChaine.s = "bla bla bla |erix14@purebasic.fr bla bla(michel.dobro@purebasic.fr) bla bla .'denis@purebasic.fr'. bla bla La@fin"
	Debug MaChaine
	a = ExtractRegularExpression(0, MaChaine, result$())
	a$ = ReplaceRegularExpression(0, MaChaine, "EMAIL")
	For k=0 To a-1
		Debug result$(k)
	Next
	Debug Str(a)+" adresses ont été trouvées."
	Debug a$
Else
	Debug RegularExpressionError()
EndIf
Lister les titres du forum de la rubrique débutant :

Code : Tout sélectionner

#RecupTitres = 1
#SupprimeTag = 2
URLForum.s = "http://www.purebasic.fr/french/viewforum.php?f=1"
FichierTMP.s = Space(2000)
If URLDownloadToCacheFile_(0, URLForum, FichierTMP, Len(FichierTMP), 0, 0) = #S_OK
	If ReadFile(0, FichierTMP)
		Longueur = Lof(0)
		*MemoryID = AllocateMemory(Longueur)
		If *MemoryID And Longueur
			ReadData(0, *MemoryID, Longueur)
			HTML.s = PeekS(*MemoryID, Longueur)
			If CreateRegularExpression(#RecupTitres, "<a.+topictitle.+</a>") And CreateRegularExpression(#SupprimeTag, "<[^>]+>")
				Dim result$(0)
				Debug "Titres du forum PureBasic => Débutants :"
				a = ExtractRegularExpression(#RecupTitres, HTML, result$()); On récupère les liens des titres
				For k=0 To a-1
					Debug " - "+ReplaceRegularExpression(#SupprimeTag, result$(k), ""); On enlève les tags
				Next
				Debug Str(a)+" titres ont été trouvées."
			Else
				Debug RegularExpressionError()
			EndIf
		EndIf
	EndIf
Else
	Debug "Désolé ! Problème d'accès au forum PureBasic"
EndIf

Publié : dim. 24/févr./2008 10:38
par nico
J'aurais bien voulu tester ton code mais la bêta 2 ne fonctionne pas chez moi, même en téléchargeant un fichier du Forum anglais!

C'est pas grave, je vais attendre, mais cette comande "CreateRegularExpression" à l'air d'être très puissantes.

Publié : dim. 24/févr./2008 10:56
par venom
bonjour,

chez moi les deux code fonctionne parfaitement :wink: . très pratique en effet cette fonction de RegularExpression. c'est une lib que tu est en train de faire erix14 ?
oui sa a l'aire prometteur.



@++

Publié : dim. 24/févr./2008 11:09
par erix14
Elle est très puissante dans le sens qu'on peut faire beaucoup de choses avec très peu de code et donc de temps. Je n'ai pas testé sa rapidité, mais je pense qu'il doit y avoir une grosse différence avec un code optimisé pour une tâche spécifique.

@venom, non, ce sont les nouvelles fonctions de la future version de PureBasic actuellement en Beta 2

Publié : dim. 24/févr./2008 12:42
par venom
a ok merci je ne savais pas que la beta 2 était sortie :P je file installer sa de suite :wink: .



@++

Publié : dim. 24/févr./2008 22:54
par Ar-S
C'est excellent et ultra rapide !
est-ce cela fonctionne sur un flux RSS ?

Publié : lun. 25/févr./2008 19:04
par erix14
Non, ce n'est pas un flux RSS. Sinon j'aurai utilisé les fonctions XML. Le programme récupère tout le code HTML de la page du forum et ensuite recherche les titres grâce aux expressions régulières.
Mais oui, cela peut donner des idées pour récupérer des données sur un site qui ne propose pas de flux RSS :wink:

Publié : mar. 26/févr./2008 8:49
par erix14
Voici maintenant un programme qui parcoure le Web de façon récursive à la recherche d'email. Il s'arrête après avoir trouvé 10 emails, pour faire une recherche plus conséquente il faut une autre méthode, car la mémoire fini par saturé...

Code : Tout sélectionner

#RecupLien = 1
#RecupEmail = 2
URL.s = "http://www.tf1.fr"
Global NewList ListeURL.s()
Global NewList ListeEmail.s()
Global NombreEmail = 0

Procedure VisitePage(LienURL.s)
	If NombreEmail = 10 : ProcedureReturn : EndIf
	ForEach ListeURL()
		If LienURL = ListeURL() : ProcedureReturn : EndIf ; la page a été déjà visitée ?
	Next
	AddElement(ListeURL()) : ListeURL() = LienURL ; on mémorise le nom de la page pour ne pas la visiter une deuxième fois
	Debug "Page : "+LienURL
	Protected FichierTMP.s = Space(2000)
	If URLDownloadToCacheFile_(0, LienURL, FichierTMP, Len(FichierTMP), 0, 0) = #S_OK
		If ReadFile(0, FichierTMP)
			Protected Longueur = Lof(0)
			Protected *MemoryID = AllocateMemory(Longueur)
			If *MemoryID And Longueur
				ReadData(0, *MemoryID, Longueur)
				HTML.s = PeekS(*MemoryID, Longueur)
				
				Protected Dim ListeResult.s(0)
				Protected a = ExtractRegularExpression(#RecupEmail, HTML, ListeResult()) ; On récupère les emails
				For k=0 To a-1
					ForEach ListeEmail()
						If ListeEmail() = ListeResult(k) : Break 2 : EndIf ; si l'email existe déjà, il ne faut pas l'enregistrer
					Next
					AddElement(ListeEmail()) : ListeEmail() = ListeResult(k)
					NombreEmail + 1
					Debug "----------------------------> Email "+Str(NombreEmail)+" : "+ListeResult(k)
					If NombreEmail = 10 : ProcedureReturn : EndIf
				Next
				
				Dim ListeResult.s(0)
				a = ExtractRegularExpression(#RecupLien, HTML, ListeResult()) ; On récupère les URLs
				For k=0 To a-1
					VisitePage(ListeResult(k)) ; parcours récursif des pages
				Next
				FreeMemory(*MemoryID)
			EndIf
		EndIf
	EndIf
EndProcedure

If CreateRegularExpression(#RecupLien, "http://[a-z0-9\-\.]+") And CreateRegularExpression(#RecupEmail, "[a-zA-Z0-9\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z]+")
	VisitePage(URL)
EndIf

Debug "Fin de la recherche"

Publié : mar. 26/févr./2008 22:20
par comtois
tu n'as plus qu'à y joindre quelques fonctions de la lib mail pour envoyer un petit coucou à toutes ces adresses mails :)

Publié : mar. 26/févr./2008 23:20
par erix14
Wouai! ça devient de plus en plus facile de se faire un robot Spameur... Mais c'est pas bien de faire ça! :x

Publié : mar. 26/févr./2008 23:35
par Jacobus
Dans cette partie :

Code : Tout sélectionner

If CreateRegularExpression(#RecupLien, "http://[a-z0-9\-\.]+") And CreateRegularExpression(#RecupEmail, "[a-zA-Z0-9\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z]+")
   VisitePage(URL)
EndIf 
Les expressions régulières, c'est du standard ou tu as déterminé les caractères à chercher d'une façon particulière? [a-zA-Z0-9\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z] ???

Publié : mer. 27/févr./2008 0:10
par erix14
Sur le web il existe toute sorte d'expression régulière pour les emails. Celle-là, je l'ai pondu moi-même, mais au final elles se ressemblent toutes. Je n'ai pas de méthode particulière, il suffit de savoir ce que l'on cherche. Par exemple, si tu veux chercher tous les mots d'un texte, il faut savoir quels caractères peuvent composer un mot. Dans l'exemple si dessous, un mot doit être composé de caractères compris entre a et z, A et Z et les caractères é,è,ç

Code : Tout sélectionner

If CreateRegularExpression(0, "[a-zA-Zéèç]+")
	Dim result$(0)
	MaChaine.s = "Les expressions régulières, c'est du standard ou tu as déterminé les caractères à chercher d'une façon particulière?"
	Debug MaChaine
	a = ExtractRegularExpression(0, MaChaine, result$())
	For k=0 To a-1
		Debug result$(k)
	Next
	Debug Str(a)+" mots ont été trouvées."
Else
	Debug RegularExpressionError()
EndIf
Les expressions régulières peuvent faire peur quand on les voit, mais en réalité c'est très simple.

Publié : mer. 27/févr./2008 12:54
par erix14
Dans mon dernier exemple, on peut aussi faire la démarche inverse. C'est à dire, indiquer les caractères qui ne composent pas un mot : l'espace, l'apostrophe, la virgule, le point d'interrogation,...

Code : Tout sélectionner

If CreateRegularExpression(0, "[^ ',\?]+")
	Dim result$(0)
	MaChaine.s = "Les expressions régulières, c'est du standard ou tu as déterminé les caractères à chercher d'une façon particulière?"
	Debug MaChaine
	a = ExtractRegularExpression(0, MaChaine, result$())
	For k=0 To a-1
		Debug result$(k)
	Next
	Debug Str(a)+" mots ont été trouvées."
Else
	Debug RegularExpressionError()
EndIf

Publié : mer. 26/mars/2008 12:23
par Fortix
Salutation

J'aimerais tellement obtenier la derniere version bêta 2,
mais je ne sais pas comment 8O

car mon plus grand souhait serait de pouvoir créer des expressions régulieres façon @Erix

merci :D

Publié : mer. 26/mars/2008 12:37
par Backup
Fortix a écrit :Salutation

J'aimerais tellement obtenier la derniere version bêta 2,
mais je ne sais pas comment 8O

car mon plus grand souhait serait de pouvoir créer des expressions régulieres façon @Erix

merci :D
repeté 20000 fois :)

tu vas ici :
http://www.purebasic.com/securedownload/Login.php

tu entre ton login et passe (ton email+ton pass donné au moment de l'achat)
et tu accede a ton espace de telechargement ..