Aide sur une expression réguliere

Invité
Invité n'ayant pas de compte PHPfrance

19 avr. 2007, 18:50

Bonjour,

Voila je cherche simplement à extraire la valeur du href et le nom du lien d'une balise <a>

Exemple:

Code : Tout sélectionner

<a href="http://www.google.com" class="lienFleche1">titre_url</a>
je voudrai récupérer "http://www.google.com" et "titre_url".
j'utilise donc une expression régulière:
'/<a\s+href="(.*?)"\s+class="lienFleche1"\s*>(.*?)<\/a>/s'
La pas de problème, je récupère bien les infos, mais la ou ca bloc c'est dans un cas comme celui la :

Code : Tout sélectionner

<a class="lienFleche1" href="http://www.google.com">titre_url</a>
La évidemment mon expression ne marche pas ... comment faire sans utiliser une 2e expression ?

Merci !

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

25 avr. 2007, 12:50

Essaye ça:

Code : Tout sélectionner

'^<a .*href="(.*?)".*>(.*?)</a>$'
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

25 avr. 2007, 14:59

Je cherche tout les liens avec l'attribut class="lienFleche1">, ce n'est donc pas la réponse que j'espérait ... :cry:

Eléphant du PHP | 170 Messages

25 avr. 2007, 21:54

En apnée, sans réfléchir :
<?php
preg_match_all('`<a(.*?)class="lienFleche1"(.*?)>([^<]+)</a>`i',$texte,$out);
?>
Faire le tri dans $out[1], $out[2] et $out[3]
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Invité
Invité n'ayant pas de compte PHPfrance

26 avr. 2007, 09:57

A ça tu l'as pas dit,
Essaye donc cette forme :

Code : Tout sélectionner

'^<a [^>]*(class=["\']lienFleche1["\'][^>]*href=["\']([^"\']*)["\']|href=["\']([^"\']*)["\'][^>]*class=["\']lienFleche1["\'])[^>]*>([^<]*)</a>$'
Qui veut dire:
^<a : la chaîne traitée doir commencer par <a

class=["\']lienFleche1["\'][^>]*href=["\']([^"\']*)["\'] : cherche le critère "class=..." avant href
| : ou bien
href=["\']([^"\']*)["\'][^>]*class=["\']lienFleche1["\'] : cherche le critère "class=..." après href

>([^<]*)</a>$ : le titre du lien devant se terminer par </a>

Les formes :
[^>]* : cherche tou avant un > pour rester dans la balise ouverte
[^<]* : cherche tout avant un < pour rester hors de l'ouverture d'une balise
[^"\']* : cherche tout avant " ou ' dans notre cas oblige de traiter le texte entre guillemets ou apostrophes

Voici un code php qui vérifie cette régle (qui peut être simplifiée aussi)
<pre>
<?php
$str = '<a  class="lienFleche1" target="_blank"  sytle="color:red"  href=\'http://www.google.com\' align="left" class="lienFleche1" title="lien">titre_url</a>';
preg_match('#^<a [^>]*(class=["\']lienFleche1["\'][^>]*href=["\']([^"\']*)["\']|href=["\']([^"\']*)["\'][^>]*class=["\']lienFleche1["\'])[^>]*>([^<]*)</a>$#', $str, $m);
print_r($m);
?>
</pre>

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 avr. 2007, 10:03

oops, j'ai oublié de me connecter, l'invité c'est moi. :wink:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène