Aller au contenu

RegEx et url


ebouilleur

Sujets conseillés

Bonjour,

J'essaye d'écrire une RegEx mais j'ai un peu de mal pour finalisé ce que je veux faire.

Je veux extraire d'un texte tout ce qui est de la forme suivante :

<a href=&quot;http://www.domaine.com">qqchose</a>

Donc j'ai pondu ca :

$RegEx = '#<[aA](\s)*(href|HREF)(\s)*=(\s)*[\"|\'](.*?)[\"|\'](.*?)>*<\/a>#is';

Mais voila, je ne veux pas que le "qqchose" soit une image.. et la j'y arrive pas, des que je tente quelquechose il ne me sélectionne plus rien

il doit falloir utiliser [^img] ...

UN petit cout de main svp?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Y'a pas un vrai parser HTML en php? Ce serait quand même plus simple et plus propre...

Sinon la question est: est-ce-que le "qqchose" doit être uniquement du texte, ou il peut contenir des tags HTML à condition que ce ne soit pas une image? Dans le premier cas il suffit de chercher ([^<]*). D'ailleurs là tu as "*" tout court, ça ne le fait pas trop, puisqu'en fait c'est >* qui va correspondre.

Et tu n'as pas besoin de la plupart des () que tu as dans ta regex. De même, comme tu est en "case-insensitive" avec le flag "i", pas besoin de mettre des majuscules et minucules. Aussi, à l'intérieur de [] on ne met pas de | pour distinguer les alternatives, on ne liste que des caractères individuellement (ou des séquences genre a-z). Le | est utilisé entre parenthèses par contre (avec ?: si tu veux que les parenthèses ne soient pas capturantes). Le .*? c'est aussi assez particulier... Et puis tu pourrais avoir d'autre attributs entre le a et le href (class, target, style...).

'#<a\s+(?:[^>]*\s+)href\s*=\s*(?:\'([^']*)\'|"([^"]*)"|([^ >]*)[^>]*>([^<]*)</a>#is'

est probablement plus proche de la réalité (pas testé), mais un vrai parser HTML serait quand même mieux.

Si tu veux pouvoir capturer du texte y compris des tags HTML à l'exception de <img...> ça va être plus cotton je pense, il faut probablement utiliser des look-ahead expressions, ça requiert de l'aspirine :-)

NB: tu devrais aller (re)lire la doc sur la syntaxe des regex plutôt que d'y aller à tâtons...

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Sinon la question est: est-ce-que le "qqchose" doit être uniquement du texte, ou il peut contenir des tags HTML à condition que ce ne soit pas une image? Dans le premier cas il suffit de chercher ([^<]*). D'ailleurs là tu as "*" tout court, ça ne le fait pas trop, puisqu'en fait c'est >* qui va correspondre.

En fait l'autre travail que je fais en parrallèle c'est récupéré le texte "qqchose" pour le réutilisé. Donc si c'est une image je ne dois pas l'utilisé.

Généralement quand il y a du texte c'est sous le forme <strong>texte</strong>, donc je supprime juste les balise strong et op j'ai mon texte... mais c'est vrai que ce n'est pas passe partout...

Je testerai de chez moi l'amélioration du regex

merci

Lien vers le commentaire
Partager sur d’autres sites

En me basant sur ton regex (il y a qq erreurs) et tes remarques j'ai amélioré le mien en :

$RegEx = '#<a\s*href(\s)*=(\s)*[\"\'](.*?)[\"\'](.*?)>([^img]*)<\/a>#is';

Mais la les images ne sont pas filtré :(

enfin je continue tjs de chercher.

Lien vers le commentaire
Partager sur d’autres sites

Ben visiblement, tu n'as lu que la moitié de mes commentaires (et encore, la seule modif que tu as faite c'est éviter les minuscules/majuscules), et tu n'as toujours pas lu la doc (comme tu as l'air d'avoir du mal à la trouver, elle est ici: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php ). Je ne sais pas vraiment à quoi ça sert qu'on réponde à tes questions si tu ne lis pas ce qu'on te répond.

[^img] ça ne veut pas dire "n'importe quoi qui ne contienne pas img", ça veut dire "n'importe quel caractère sauf i, m, ou g".

Moi je te conseille de faire ton test en deux temps: tu matches sur <a href...>qqchose</a>, puis tu vérifies si qqchose est (ou contient) un <img...>.

Sinon tu peux regarder du côté de http://www.php.net/manual/en/regexp.reference.assertions.php mais déjà que moi ça me donne mal à la tête alors...

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Dans ton 1er post tu dis :

Sinon la question est: est-ce-que le "qqchose" doit être uniquement du texte, ou il peut contenir des tags HTML à condition que ce ne soit pas une image? Dans le premier cas il suffit de chercher ([^<]*)

et j'ai tester, mais ca me sort quand meme les url avec des images.

Sinon tu as aussi dis :

[^img] ça ne veut pas dire "n'importe quoi qui ne contienne pas img", ça veut dire "n'importe quel caractère sauf i, m, ou g".

Alors que dans la doc, il est indiqué comme exemple :

( \( )? [^()]+ (?(1) \) )

La deuxième partie recherche un séquence de caractères qui ne contiennent pas de parenthèses.

Donc ^() pourrait s'apparenter a mon ^img (moi c'est ce que je comprend)

Merci pour ton aide

Modifié par ebouilleur
Lien vers le commentaire
Partager sur d’autres sites

Le plus simple ne serait-il pas que tu fasses ta recherche en deux temps:

1° d'abord extraire tous les <a href=(match1)...>(match2)</a>

2° puis rechercher dans les match2, ceux qui contiennent <img ...> et les exclure des résultats.

Jean-Luc

Lien vers le commentaire
Partager sur d’autres sites

mais ca me sort quand meme les url avec des images.

Si tu as [^<]* uniquement entre le <a...> et le </a> dans ta regex, il ne peut y avoir aucun tag HTML (puisqu'il ne peut pas y avoir de <) et donc pas d'images.

Donc ^() pourrait s'apparenter a mon ^img (moi c'est ce que je comprend)

Non. Comme indiqué, [^()] veut dire "n'importe quel caractère sauf ( ou ). Donc [^()]* ou [^()]+ est n'importe quelle suite de caractères qui ne comporte pas de parenthèses, ce qui est bien ce qu'ils disent. Ca n'a rien à voir avec "n'importe quel suite de caractères qui ne comporte pas de séquence (), i.e. parenthèse ouvrante et fermante à la suite", ce qui est ce que tu voudrais.

Encore une fois, mon bon conseil (et Jeanluc te donne le même) consiste à rechercher d'abord tes <a...>qqchose</a>, et ensuite vérifier qu'il n'y a pas de <img...> dedans. Tu peux le faire directement avec une regex, mais ça va te coûter cher en aspirine.

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Je suis pas sur que je puisse séparer en 2 parties ce travail...

Le mieux c'est que je vous explique ce que je souhaite faire, peut etre que vous aurez une meilleur idée que moi.

Donc je récupere du contenu via un flux rss. Je dois modifier les url de ce contenu

Donc par exemple, je récupere :

$content = "<a href='http://www.google.fr/?var1=toto&id=456&var2=autrechose' target='_blank'><strong>Hello</strong></a>, ca va bien? Hésite pas a voir google image <a href='http://www.google.fr/?var1=toto&id=456&var2=autrechose' target='_blank'><img src='http://www.google.fr/intl/fr_fr/images/logo.gif' /></a>";

Et je veux avoir au final quelque chose du genre :

$content = "<a href='http://www.monsite.com/toto-456-hello.html' target='_blank'><strong>Hello</strong></a>, ca va bien? Hésite pas a voir google image <a href='http://www.monsite.com/toto-456.html' target='_blank'><img src='http://www.google.fr/intl/fr_fr/images/logo.gif' /></a>";

Donc en fait faut juste retranscrire l'url... (écrit comme ca ca parrait simple)

Modifié par ebouilleur
Lien vers le commentaire
Partager sur d’autres sites

Arf non, j'ai oublié un détail important (c'est ce qui rend plus compliquer le truc), le texte du lien, ici "hello" doit etre repris dans mon url, ce qui donne :

$content = "<a href='http://www.monsite.com/toto-456-hello.html' target='_blank'><strong>Hello</strong></a>, ca va bien? Hésite pas a voir google image <a href='http://www.monsite.com/toto-456.html' target='_blank'><img src='http://www.google.fr/intl/fr_fr/images/logo.gif' /></a>";

PS : je corrige dans mon post précédent

Lien vers le commentaire
Partager sur d’autres sites

Avec le code suivant c'est presque fonctionnel.

<?php
$content = "<a href='http://www.google.fr/?var1=toto&id=456&var2=autrechose' target='_blank'><strong>Paul</strong></a>, ca va bien? Hésite pas a voir google image <a href='http://www.google.fr/?var1=toto&id=456&var2=autrechose' target='_blank'><img src='http://www.google.fr/intl/fr_fr/images/logo.gif' /></a>";

$mot_a_supprimer = array("<strong>","</strong>");
$content = str_replace($mot_a_supprimer,'',$content);
$content = html_entity_decode($content);

preg_match_all('/http:\/\/www.google.fr[^"\']*/',$content,$tableau);

$RegEx = '#<a\s*href(\s)*=(\s)*[\"\'](.*?)[\"\'](.*?)>[^<]*<\/a>#is';
preg_match($RegEx,$content,$prenom);
$prenom = explode(">", $prenom[0]);
$prenom = substr($prenom[1],0,-3);

$regex1 = "^[^<]";
$out = ereg($regex1,$prenom);
if ($out > 0 ) {

$prenom = suppaccents(utf8_decode($prenom)); // suppaccents est une fonction qui vire les accent et met des - a la place des espaces

$nb=count($tableau[0]);
for($i=0;$i<$nb;$i++)
{
$old_url = $tableau[0][$i];
$pieces_url = explode("&", $old_url2);
$ref2 = str_replace("var2=","",$pieces_url[1]);
$new_url = "http://www.monsite.com/mot-".$prenom."-fr-".$ref2.".html";
$content = str_replace($old_url,$new_url,$content);
}

echo "<hr>".$content;
}


?>

Ce qui affiche cette url : http://www.monsite.com/mot-paul-fr-456.html

Ca bug uniquement si la 1ere url contient une image

Modifié par ebouilleur
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...