Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2004, 23h31   #1
Membre régulier
 
Inscription : novembre 2002
Messages : 310
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 310
Points : 93
Points : 93
Par défaut [Script]Extraire une url

Bonjour
J'ai un fichier contenant un tas de lignes avec diverses informations et dans une de ces lignes, il y a l'url d'un site.

ça donne ça en gros :
Citation:
texte texte texte texte
texte texte texte texte
texte texte texte texte texte texte http://www.monsite.com/index.php?sid=blabla&topic=45 texte texte texte
texte texte
Comment extraire l'url de ce fichier?
J'ai essayé en faisant ça :


Code :
1
2
3
<?php
ereg("http(.*)\s",$ligne,$tableau);
?>

afin que ça s'arrête au premier espace trouvé (\s) mais lorsque j'affiche $tableau[1], il s'arrête au premier s trouvé

Voici mon code complet :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$trouve = false;
$pointeur = fopen('essai.txt','r');
 
//recherche de la ligne contenant l'url
while(($trouve == false) && ($ligne = fgets($pointeur)))
{
    if (strstr($ligne,'http://'))
    {
        $trouve = true;
    }
}
ereg("http(.*)\s",$ligne,$tableau);
print_r($tableau);
 
//affiche Array ( [0] => http://www.monsite.com/index.php?s [1] => ://www.monsite.com/index.php? )
?>
Merci d'avance pour votre aide
Hell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2004, 23h44   #2
Membre régulier
 
Inscription : novembre 2002
Messages : 310
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 310
Points : 93
Points : 93
Salut
je connais bien cette fonction mais je pensais qu'un regex pouvait faire ça, ça évite de faire une boucle
si ce n'est pas possible, je l'utiliserai
merci en tout cas
Hell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2004, 23h47   #3
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Effectivement! J'ai effacé mon message car l'utilisation d'une boucle avec strpos() n'est pas la meilleure solution je suppose... En plus tu devras trouver l'espace de la fin de l'url pour délimiter cette-dernière... Donc ça fait un strpos() sur "http://" plus un autre pour l'espace de fin... Essaye de trouver une solution plus simple si possible. Bon courage, à+
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2004, 23h50   #4
Membre régulier
 
Inscription : novembre 2002
Messages : 310
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 310
Points : 93
Points : 93
merci
c'est justement cet espace que je n'arrive pas à mettre, pourtant \s signifie bien espace mais ça ne fonctionne pas; je vais continuer à faire des essais
Hell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2004, 23h55   #5
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Le caractère #0 peut-être présent dans un fichier, mais invisible à l'affichage.
Il peut fausser la recherche dans certains cas.
Quoiqu'il en soit, l'espace = chr(32). Peut-être peux-tu l'utiliser dans ton code...
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2004, 00h03   #6
Membre régulier
 
Inscription : novembre 2002
Messages : 310
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 310
Points : 93
Points : 93
Ca y est presque
grace à toi ça affiche :
"://www.monsite.com/index.php?sid=blabla&topic=45 texte texte", bizarre qu'il se soit pas arrêté au premier espace
Hell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2004, 21h39   #7
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
La bibliothèque des expressions régulières pcre est recommandée pour sa rapidité et la possibilité d'utiliser des options.

Je ferais ceci :
Code :
1
2
preg_match('/http[^\s]*/i',$txt,$sortie);
echo $sortie[0];
/ est un délimiteur de motif (tu peux mettre ce que tu veux |&`ù%....)
[^\s] est une classe de négation de caractères (tout caractère sauf l'espace \s)
* 0 ou plus
i est une l'option "insensible à la casse" (au cas où tu aurais HTTP://...)

Pour ton expression, il me semble que \s ne soit pas supporté par les regex posix. Il prendra donc le caractère s (échappé par \). Si tu tiens vraiment aux regex posix essaye [^[:space:]] pour remplacer [^\s]
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2004, 12h04   #8
Rédacteur

 
Inscription : septembre 2002
Messages : 1 591
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : septembre 2002
Messages : 1 591
Points : 3 108
Points : 3 108
Citation:
Envoyé par ripat
La bibliothèque des expressions régulières pcre est recommandée pour sa rapidité et la possibilité d'utiliser des options.
ça je ne suis pas tout à fait d'accord. Les regex ont la réputation d'être lentes et il vaut mieux utiliser les fonctions de chaînes de caractères classique quand c'est possible.

Citation:
Envoyé par ripat
Je ferais ceci :
Code :
1
2
preg_match('/http[^\s]*/i',$txt,$sortie);
echo $sortie[0];
Bon début, mais j'aurais plutôt utilisé preg_match_all

pour rechercher toutes les occurrences d'URL trouvées dans la chaîne.
stephane eyskens est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2004, 14h42   #9
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Citation:
Envoyé par stephaneey
ça je ne suis pas tout à fait d'accord. Les regex ont la réputation d'être lentes et il vaut mieux utiliser les fonctions de chaînes de caractères classique quand c'est possible.
Je parlais des PCRE comparées aux POSIX...
Ceci dit, tu as raison, les traitements de chaîne sont plus rapides, mais bonjour la galère pour tenir compte de la casse, des césures et autres alternations....

Tu peux en effet t'en tirer avec des strpos ou stripos (php5) mais quid si il y a dans le texte d'autres mots avec 'http' comme
Citation:
"Le protocole http etc...lien http://www.monsite.com/index.php?sid=blabla&topic=45 texte....."
Les regex sont peut-être plus lentes mais quelle facilité quand on est paresseux comme moi

Citation:
Envoyé par stephaneey
Bon début, mais j'aurais plutôt utilisé preg_match_all
pour rechercher toutes les occurrences d'URL trouvées dans la chaîne.
T'as encore raison mais dans la question il y a :
Citation:
dans une de ces lignes, il y a l'url d'un site.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2004, 15h11   #10
Membre régulier
 
Inscription : novembre 2002
Messages : 310
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 310
Points : 93
Points : 93
Je vous remercie, c'est très sympa de m'avoir aidé !
Ca fonctionne parfaitement maintenant, c'est bien plus simple qu'avec strpos/substr/strlen

Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
//texte
$ligne = 'fdfsdjkfdjskljfldks http://www.google.fr fodfkljskljsdf';
 
//s'arrete au premier espace trouvé ( \s )
preg_match('/http[^\s]*/',$ligne,$tableau);
 
//affichage
echo $tableau[0]
 
?>
Hell est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h21.


 
 
 
 
Partenaires

Hébergement Web