ebouilleur Posté 26 Octobre 2009 Posté 26 Octobre 2009 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="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
jcaron Posté 27 Octobre 2009 Posté 27 Octobre 2009 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.
captain_torche Posté 27 Octobre 2009 Posté 27 Octobre 2009 En ce qui concerne les regex, cette page est une vraie mine d'or : http://lumadis.be/regex/tuto_pcre.php
ebouilleur Posté 27 Octobre 2009 Auteur Posté 27 Octobre 2009 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
ebouilleur Posté 27 Octobre 2009 Auteur Posté 27 Octobre 2009 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.
jcaron Posté 27 Octobre 2009 Posté 27 Octobre 2009 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.
ebouilleur Posté 27 Octobre 2009 Auteur Posté 27 Octobre 2009 (modifié) 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é 27 Octobre 2009 par ebouilleur
Jeanluc Posté 27 Octobre 2009 Posté 27 Octobre 2009 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
jcaron Posté 27 Octobre 2009 Posté 27 Octobre 2009 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.
ebouilleur Posté 28 Octobre 2009 Auteur Posté 28 Octobre 2009 (modifié) 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é 28 Octobre 2009 par ebouilleur
captain_torche Posté 28 Octobre 2009 Posté 28 Octobre 2009 Et tu ne peux pas tout simplement rechercher les chaînes de caractères qui constituent une url ? Ca serait beaucoup plus simple !
ebouilleur Posté 28 Octobre 2009 Auteur Posté 28 Octobre 2009 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
ebouilleur Posté 30 Octobre 2009 Auteur Posté 30 Octobre 2009 (modifié) 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é 30 Octobre 2009 par ebouilleur
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant