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 23/03/2006, 09h09   #1
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
Par défaut récupérer tous les liens d'une page

Bonjour,

J'aimerais faire un ptit bout de code qui permettrait de trouver tous les liens dans une page et de les ouvrir dans une nouvelle fenêtre a chaque fois...

Est-ce possible ? Pouvez-vous m'aider ? Par ou dois-je commencer svp ?

Merci
++
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2006, 09h18   #2
Membre éprouvé
 
Avatar de gofono_bass
 
Inscription : décembre 2005
Messages : 385
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2005
Messages : 385
Points : 409
Points : 409
Salut,
A mon avis, tu devrais commencer par les etapes suivantes :
- prendre le contenu de la page (le code HTML donc) soit avec fsockopen soit avec CURL
- tu recherches les liens avec des expressions régulières
- tu affiches les pages..
__________________
mais pourquoi tu cours?
gofono_bass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2006, 10h08   #3
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
Ok mais en fait c'est surtout pour les expressions régulieres que ca se complique, ca devient plus délicat, parce que j'aimerais ouvrir tous les liens, même si c'est du type http://www.url.com/page.php?go=111&p=5555

Enfin vraiment toutes les urls quoi et non ceux du type www.domaine.com


Et après je pense le deuxieme probleme, c'est pour le fait d'ouvrir chaque lien dans une nouvelle page, je me demande meme si c'est possible avec php ? Ne faut-il pas passer par du javascript ?

MErci
++
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2006, 10h33   #4
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
Re, c'est encore moi, voila j'ai du trouvé du javascript pour ouvir une fenetre a chaque fois grave a un for en php mais maintenant il me faut une expression réguliere pour récuperer dans une chaine de caractere $texte toutes les urls présentes...

Merci
++
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2006, 15h14   #5
Invité de passage
 
Inscription : janvier 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 17
Points : 3
Points : 3
Envoyer un message via MSN à lyhana8
va voir cette page http://lyhana8.free.fr/index.php?include=source.php&wsc=source.php
c'est une page a moi qui me permet d'afficher les sources de mes script et remplaçant les nom de fichier .php, .js ou . htm par un lien pointant vers eux. Pour ca j'utilise des expression regulieres:
Code :
        $h_str = eregi_replace("(['\" =])(([a-zA-Z0-9_-]+)\.(php|css|js|htm))([\?'\" ])", "\\1<a href='index.php?include=source.php&amp;wsc=\\2' >\\2</a>\\5", highlight_file($p_file, TRUE));
la chaine sera de type:
Code :
(['\" =])(([a-zA-Z0-9_-]+)\.(php|css|js|htm))([\?'\" ])
et remplacer par :
Code :
\\1<a href='index.php?include=source.php&amp;wsc=\\2' >\\2</a>\\5
On travaillera avec la chaine :
Code :
highlight_file($p_file, TRUE)
bon vite fais: les \\numero correspondante aux different block de parenthese (le numero indique la parenthese ouvrante du bloc).
par exemple ici \\1 sera remplacer par l'un des caracteres suivants : (celui qu'elle aura trouver, ya un espace !).
toi en gros il faut que tu recherche les truc genre
Donc j'espere que tu es pas trop bordelique niveau guillemets espace ou autre dans tes balises sinon ca va etre un peu plus galere.
Pour ta chaine regexp va voir ca http://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re (si t'y connais rien en regexp ca pourra t'aider un peu).
Je peu te proposer ca:
Code :
(href=")(([a-zA-Z0-9_-]+)\.(php|htm))(\?[a-zA-Z0-9_-&=]*)(\")
decoupage des parametres:
Code :
1
2
3
4
5
\\1 (href=")
\\2 (([a-zA-Z0-9_-]+)\.(php|htm))
\\3 ([a-zA-Z0-9_-]+)
\\4 (php|htm)
\\5 (\?[a-zA-Z0-9_-&=]*)
la chaine de remplacement (que tu utilisera pour ton javascript) sera du type:
Ce qui devrai donc donner:
Code :
1
2
$js = eregi_replace("(href=")(([a-zA-Z0-9_-]+)\.(php|htm))(\?[a-zA-Z0-9_-&=]*)(\")",  "href='\\2\\5'", $ch);
$ch la source de ton fichier htm je suppose.
Mai je ne garanti rien, les regexp, c'est tout un art il te faudra peut etre modifier le 1er parametre de eregi_replace
bonne chance
lyhana8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2006, 15h22   #6
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
très bon post avec de très bonne explications, par contre essaie de travailler avec les expressions régulières perl qui sont plus performante

preg_replace()

Pierre
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2006, 16h44   #7
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
euh oui merci mais j'ai pas vraiment tout compris la... je sais pas si t'as vraiment compris ce que je cherchais a faire en fait...

Par exemple, j'ai ceci, j'ai un texte dans la variable $texte :

$texte="Slt, ca va, une adresse http://www.domaine.com et puis ca aussi http://www.domaine.com/page.php?aaa=eee&bbbb=ffff et voila, aller encore une http://www.aaaa.com/index.php !"

Et j'aimerais au final, pouvoir affiché les adresses comme ca par ex :
http://www.domaine.com
http://www.domaine.com/page.php?aaa=eee&bbbb=ffff
http://www.aaaa.com/index.php


Merci ++[/quote]
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2006, 17h08   #8
Membre éclairé
 
Inscription : janvier 2004
Messages : 424
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2004
Messages : 424
Points : 310
Points : 310
moi j'utilise cette petite fonction qui a l'air de bien marcher.. mais je ne suis pas un grand pro des expressions regulieres.. donc sans garantie ..

Code :
1
2
3
4
5
6
7
8
9
10
11
function get_urls($string, $strict=true) {
 
   $types = array("href", "src", "url");
   while(list(,$type) = each($types)) {
       $innerT = $strict?'[a-z0-9:?=&@/._-]+?':'.+?';
       preg_match_all ("|$type\=([\"'`])(".$innerT.")\\1|i", $string, &$matches);
       $ret[$type] = $matches[2];
   }
 
	return $ret;
}
et ta variable $ret, contient un tableau avec toutes tes urls trouvées dans les attributs href, src et url.. bien sympa !
zevince est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2006, 18h23   #9
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
oki tu pourrais donner un exemple entier, concret zevince stp... pour voir comment l'utiliser...

Merci

++
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2006, 19h13   #10
Invité de passage
 
Inscription : janvier 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 17
Points : 3
Points : 3
Envoyer un message via MSN à lyhana8
Je peux te propose ca:
$js = preg_match_all("(http://)(([a-zA-Z0-9_-]+)([\/]+)\.(php[\?]?))([a-zA-Z0-9_-&=]*)", "\\2\\5'", $texte);
mais je ne garantie pas la validiter de la regexp

regarde les exemple de cette fonction : http://fr3.php.net/manual/fr/function.preg-match.php il ya un exemple Lire un nom de domaine dans une URL, qui je pense contient la regexp que tu cherches, a savoir:
Code :
/^(http:\/\/)?([^\/]+)/i
Apres a toi de bidouiller pour faire exactement ce que tu cherches.
Ici les url ayant des parametre seraient recuperer sans les parametres, regarde les liens sur l'article de wikipedia un des sites explique assez bien.
Code :
1
2
3
4
5
6
7
 
<?php
// repérer le nom de l'hôte dans l'URL
preg_match("/^(http:\/\/)?([^\/]+)/i",
   "http://www.php.net/index.html", $matches);
$host = $matches[2];
?>
voila, bon courage.
lyhana8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2006, 11h44   #11
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
Bonjour,

Voila, j'ai essayé en mettant que le début commence par href=' et la fin par ' mais ca ne marche pas, quelqu'un pourrait me dire pourquoi svp ?

Merci
++

Code :
1
2
3
4
5
 
$string = "<a href='http://www.aaaa.com'>exemple : </a>";
if (eregi("^(href=')(')$", $string)) {
    echo "'$string' contient bien une adresse!";
}
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2006, 14h15   #12
Membre émérite
 
Avatar de Yobs
 
Inscription : avril 2004
Messages : 675
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 675
Points : 808
Points : 808
Envoyer un message via MSN à Yobs
Ton texte est-il en html ou c'est un texte basique? Si html, zevince t'a donné la réponse car en fait il ne suffit que de récupérer l'adresse comprise dans le href de la balise <a>.
__________________
Chaque problème a une solution, mais il est plus facile de répondre si le problème est correctement renseignés
Yobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2006, 15h15   #13
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 423
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 423
Points : 2 811
Points : 2 811
moi je ferais ça côté client

j'ouvre la page html en php et j'y colle au passage un js qui fait la chose

pour cela js te donne getElementsByTagName qui te retourne un table de XMLNodes

pour chaque noeud de la table tu récupère son attribut hef s'il existe tu y ajoute un attribut target

c'est extrêment simple


tu peux aussi faire ça côté php avec le DOM si tu est sur que html de la page est conforme.

A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2006, 15h34   #14
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
Slt

En fait c'est du texte basique, par exemple, voici ce que j'ai essayé, ca marche toujours pas :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<?php
function get_urls($string, $strict=true) { 
 
   $types = array("href", "src", "url"); 
   while(list(,$type) = each($types)) { 
       $innerT = $strict?'[a-z0-9:?=&@/._-]+?':'.+?'; 
       preg_match_all ("|$type\=([\"'`])(".$innerT.")\\1|i", $string, &$matches); 
       $ret[$type] = $matches[2]; 
   } 
 
   return $ret; 
}
 
 
echo get_urls('<a href="http://www.aaaa.com">exemple : </a>');
?>
italiasky est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2006, 15h52   #15
Membre émérite
 
Avatar de Yobs
 
Inscription : avril 2004
Messages : 675
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2004
Messages : 675
Points : 808
Points : 808
Envoyer un message via MSN à Yobs
Normal car sa renvoie un tableau, pour l'afficher:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function get_urls($string, $strict=true) { 
 
   $types = array("href", "src", "url"); 
   while(list(,$type) = each($types)) { 
       $innerT = $strict?'[a-z0-9:?=&@/._-]+?':'.+?'; 
       preg_match_all ("|$type\=([\"'`])(".$innerT.")\\1|i", $string, &$matches); 
       $ret[$type] = $matches[2]; 
   } 
 
   return $ret; 
}
 
$test = get_urls('<a href="http://www.aaaa.com">exemple : </a>'); 
echo '<pre>'."\n";
print_r($test);
echo '</pre>'."\n";
__________________
Chaque problème a une solution, mais il est plus facile de répondre si le problème est correctement renseignés
Yobs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2006, 18h55   #16
Membre habitué
 
Étudiant
Inscription : janvier 2006
Messages : 501
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2006
Messages : 501
Points : 113
Points : 113
oki merci ca marche, je récupere donc les adresses avec $test[href][0] puis $test[href][1] etc...mais comment faire pour toutes les récupérer sans savoir combien il y en a ? J'ai essayé avec un foreach mais je ne vois pas trop comment faire en fait...

Merci
++
italiasky 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 11h14.


 
 
 
 
Partenaires

Hébergement Web