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 30/10/2007, 11h47   #1
Invité régulier
 
Inscription : janvier 2004
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 24
Points : 8
Points : 8
Par défaut Exclure une chaine dans un motif, pour extraire des liens html

Bonjour,

Il s'agit surement d'un problème assez simple, et pourtant...

Je cherche à capturer toutes les urls de liens dans ma page html.

Autrement dit, imaginez le texte suivant :

Code :
Bonjour, j'ai <a href="ok1">besoin</a> de votre aide, parce que <a href="ok2">vous êtes = à des pros</a>

Comment récupérer "ok1" et "ok2" ?
Actuellement, mon motif était le suivant :

Code :
$reg = '/<a href="([^<]*)">([^=]*)<\/a>/';
Ca a marché, jusqu'à ce que un texte de lien contienne le signe "=", comme dans l'exemple ci-dessus.

En effet, j'excluais le signe "=", mais pour que ça marche, il faudrait que je puisse exclure exclure une chaine.

Une sorte de [^MACHAINE]. Ainsi, je ferai le motif suivant :

Code :
$reg = '/<a href="([^<]*)">([^href]*)<\/a>/';
Mais ça ne marche pas, parce que je ne sais pas exclure une chaine dans un motif. Et ^href n'exclu pas la chaine href...

Existe t-il une solution ?

Merci pour votre aide.
Dimitri01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2007, 13h06   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
essaye ça :
Code :
$reg = '#<a href="([^"]*)">([^<]*)</a>#';
regarde aussi cette expression régulière qui est plus développée là :
http://g-rossolini.developpez.com/tu...page_2#LII-3-b
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2007, 14h24   #3
Invité de passage
 
Inscription : novembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 2
Points : 2
Points : 2
Bonjour,
j'ai moi aussi un peu le même probleme et je patauge un peu.
Je cherche à extraire l'url et le contenu des liens d'un page html.
Concretement voilà ce que j'appelle url et contenu dans un lien : <a href="url">contenu</a>

J'ai d'abord utilisé cette expression :
Code :
$reg = '/<a([^>])*href="([^"]+)"([^>])*>(.*)<\/a>/'
mais il ne sort qu'un résultat lorsque 2 liens sont sur la meme ligne, j'ai donc voulu interdire la présence de "</a>" dans le contenu avec une expression de ce style :
Code :
$reg = '/<a([^>])*href="([^"]+)"([^>])*>([^\(<\/a\)]*)<\/a>/'
mais ce motif là [^\(<\/a\)] ne marche pas.

Est il possible d'interdire toute une chaine ?

Merci d'avance
Mr. Pink est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2007, 15h48   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Mr. Pink
mais ce motif là [^\(<\/a\)] ne marche pas.
C'est tout à fait normal puisque vous utilisez une classe qui a un tout autre but au lieu d'une assertion négative. Une classe, est un ensemble de caractères qu'il faut considérer comme une alternative. [abc] dit que la chaîne doit comporter a ou b ou c et non la chaîne abc. Quand elle est niée c'est la même chose [^abc] : tout caractère qui n'est ni a ni b ni c et non pas une chaîne ne contenant pas abc.

A priori, il vous manque déjà plutôt, et pour commencer, la spécification du caractère non gourmand de l'expression (option U à la fin de celle-ci) - que l'on peut aussi spécifier de manière individuelle après chaque quantifieur (?, *, +) en le faisant succéder de ?.

Choisissez également mieux vos délimiteurs ça vous évitera d'avoir à les échapper.

Mais tout est détaillé dans le tutoriel : Initiation aux expressions régulières en PHP.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2007, 16h40   #5
Invité de passage
 
Inscription : novembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 2
Points : 2
Points : 2
Merci pour cette précieuse aide, va falloir que je me penche plus serieursement sur l'etendue des capacités des expressions regulieres.

Donc voilà avec cette expression ça marche :
Code :
'#<a([^>]*)href="([^"]*)"([^>]*)>(.*)</a>#U'
Ca récupere url et contenu de tous les liens.
Merci
Mr. Pink est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h41.


 
 
 
 
Partenaires

Hébergement Web