probleme fonction extraction de liens

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : probleme fonction extraction de liens

par BaLiSTiK » 30 juin 2006, 16:00

j ai demandé a un collegue et il a trouvé la soltion c etait extremement simple :
preg_match_all('`<[[a;A] href="[^>]+">[^<]+</[a;A]>`', $content,$out);
voila :)

par Ripat » 29 juin 2006, 17:02

Pour ton problème, rajoute l'option i (insensible à la casse) derrière les délimiteurs de ton motif.

par BaLiSTiK » 29 juin 2006, 16:49

Et pourquoi pas simplifier? Tu peux faire la capture de liens en une seule regex. Du moins si j'ai bien compris ton bout de code.
preg_match_all('#<a href="([^"]+)">#i', $txt, $out);
echo '<pre>'; print_r($out[1]); echo '</pre>';
la capture de lien se fais bien sauf qu'avec ma fonction actuelle, je ne récupère les URL se trouvant uniquement entre <A href>..</A> et non pas entre <a href>...</a> ou inversement, tout dépend comment je modifie $motif.
Ton exemple de code correspond au premier preg_match ou au second?a quoi correspond $txt?

par header » 29 juin 2006, 16:35

Et pourquoi pas simplifier? Tu peux faire la capture de liens en une seule regex. Du moins si j'ai bien compris ton bout de code.
preg_match_all('#<a href="([^"]+)">#i', $txt, $out);
echo '<pre>'; print_r($out[1]); echo '</pre>';

Lol tu à raison
Enfin comme ça il à revu ses boucles

ps Ripat:
http://www.expreg.com/

par BaLiSTiK » 29 juin 2006, 16:08

pas vmt bien saisi mais j ai essayé :
function getHrefLinks($content) {
  $motif='`<A href="[^>]+">[^<]+</A>`';
  for($i=0;$i < 2;$i++){
	   	
	preg_match_all($motif, $content,$out);
        $motif='`href="[^>]+"`';
        $out3 = array();
		foreach ($out[0] as $value) {
                preg_match_all($motif,$value,$out2);
                if (count($out2)>0) {
                        $thisString = $out2[0][0];
                        $thisString = str_replace("\"", "", $thisString);
                        $thisString = str_replace("href=", "", $thisString);
                        $thisString2 = split (" ", $thisString);
                        $thisString = $thisString2[0];
                        if (substr($thisString, 0,strlen("http://"))!="http://") {
                                $urlParsed = parse_url($_SERVER["PHP_SELF"]);
                                $path_parts = pathinfo($urlParsed["path"]);
                                $thisString = "http://".$_SERVER["HTTP_HOST"].$path_parts["dirname"].$thisString;
                        }//fin if
		$out3[] = $thisString;
                }//fin if
        }//fin foreach
        return $out3;
	$motif = strtolower($motif);
	}//fin boucle for
}

par Ripat » 29 juin 2006, 16:07

Et pourquoi pas simplifier? Tu peux faire la capture de liens en une seule regex. Du moins si j'ai bien compris ton bout de code.
preg_match_all('#<a href="([^"]+)">#i', $txt, $out);
echo '<pre>'; print_r($out[1]); echo '</pre>';

par header » 29 juin 2006, 15:43

Re

Pour moi ta boucle n'est pas au bon endroit,

Je t'explique :

Tu dois englober le tout, c'est à dire le debut de ta boucle (FOR)
au debut du code de ta fonction

Tu sais déjà que tu dois faire deux tours de boucle (1 en majuscule et 1
en minuscule)

Donc tu fait une variable de comptage que tu imcrémente de un de façon à faire deux tours :)

Ensuite à la fin de ta fonction mais pas en dehors de la boucle (tu suis? lol)

tu fait un
$motif = strtolower($motif);
Et vla un tour de maj et un tour de min en un fonction ;)

par BaLiSTiK » 29 juin 2006, 14:49

ça donnerai ceci alors :
function getHrefLinks($content) {
  
for (blabla){
	$motif='`<A href="[^>]+">[^<]+</A>`';
	preg_match_all($motif, $content,$out);
        $motif='`href="[^>]+"`';
        $out3 = array(); }//fin boucle

        $motif = strtolower($motif);
        foreach ($out[0] as $value) {
                preg_match_all($motif,$value,$out2);
                if (count($out2)>0) {
                        $thisString = $out2[0][0];
                        $thisString = str_replace("\"", "", $thisString);
                        $thisString = str_replace("href=", "", $thisString);
                        $thisString2 = split (" ", $thisString);
                        $thisString = $thisString2[0];
                        if (substr($thisString, 0,strlen("http://"))!="http://") {
                                $urlParsed = parse_url($_SERVER["PHP_SELF"]);
                                $path_parts = pathinfo($urlParsed["path"]);
                                $thisString = "http://".$_SERVER["HTTP_HOST"].$path_parts["dirname"].$thisString;
                        }
						$out3[] = $thisString;
                }
        }
        return $out3;

}
par conter quoi mettre exactement dans la boucle for :roll:

par header » 29 juin 2006, 13:24

Non puisque

Code : Tout sélectionner

<A href="[^>]+">[^<]+</A>
Ne contient que la selection de caractére a rechercher et non se qu'il y a entre

Code : Tout sélectionner

<A href=
et

Code : Tout sélectionner

</A>

par BaLiSTiK » 29 juin 2006, 11:54

je suis allez voir ce que le strtolower signifiait, et si j ai bien compris ça retranscrit les majuscules en minuscule. Mais si je l'utilise, les URL se trouvant entre les balises en majuscules ne seront pas pris en compte ?
Car il faut que j extrait les url entre balises majuscules et celle en minuscules.

je precise que les URL se trouve dans une table dans lequels elles sont disséminés dans plusieurs enregistrement. et que certaine sont en <a href> et d autre en <A href>.

par header » 29 juin 2006, 11:37

Tu n'es pas obligé de faire un deuxiémes fonction

Tu peux juste faire un boucle dans ta fonction avec une fois
la chaine
$motif='`<A href="[^>]+">[^<]+</A>`';
et utiliser une fois
strtolower($motif);
@+ ;)

probleme fonction extraction de liens

par BaLiSTiK » 29 juin 2006, 10:41

bjr, j ai une fonction qui permet d extraire des liens compris entre les balises <A href> et </A> se trouvant dans une base de donnée, ça marche nickel sauf à un detail pres. Elle n extrait que les lien compris entre <A href="url">balbla</A> et non avec <a href="url">blabla</a>

la fonction :
function getHrefLinks($content) {
        $motif='`<A href="[^>]+">[^<]+</A>`';
		preg_match_all($motif,$content,$out);
        $motif='`href="[^>]+"`';
        $out3 = array();
        foreach ($out[0] as $value) {
                preg_match_all($motif,$value,$out2);
                if (count($out2)>0) {
                        $thisString = $out2[0][0];
                        $thisString = str_replace("\"", "", $thisString);
                        $thisString = str_replace("href=", "", $thisString);
                        $thisString2 = split (" ", $thisString);
                        $thisString = $thisString2[0];
                        if (substr($thisString, 0,strlen("http://"))!="http://") {
                                $urlParsed = parse_url($_SERVER["PHP_SELF"]);
                                $path_parts = pathinfo($urlParsed["path"]);
                                $thisString = "http://".$_SERVER["HTTP_HOST"].$path_parts["dirname"].$thisString;
                        }
						$out3[] = $thisString;
                }
        }
        return $out3;
}
je voudrais eviter de faire une deuxieme fonction qui contiendrait
$motif='`<a href="[^>]+">[^<]+</a>`';
Y a t'il un moyen de concatener ou alors opter pour la solution d une fonction getHrefLinks2 qui extrait les lien dont les balises sont en minuscule?