cs_caviar
Messages postés329Date d'inscriptionsamedi 4 janvier 2003StatutMembreDernière intervention29 mars 2015
-
2 mai 2007 à 16:56
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008
-
4 mai 2007 à 13:10
Saluté...
Je bosse sur un système de moteur de recherche en ce moemtnet j'essaye d'optimiser tout ça avec des regex... bon l'idée est de pouvoir récupérer tous les liens d'une page depuis son code source ...
le problème est qu'il existe pluiseurs types de liens
ceux commencant
par http
par ./
par ../
par dossier/
par /dossier/
ou ceux étant simplement un nom de fichier
genre [index.php accueil]
ensuite on a les variables passées en get à prendre en compte ...donc tout ce qui siut le nom de fichier et qui commence par un ?
ok ...deja tout ça c'est pas mal ... mais bien sur il faut éviter de prendre les javascript tout en récupérant les liens qui peuvent y être
genre la dedans
[javascript:window.open('pagepopup.php','newsletter_exemple', 'status= yes,resizable=yes,scrollbars=yes,width=610,height=500'); void(0); Titres du jour ] : Du lundi au vendredi, les titres de l'actualité développés sur Le Monde.fr.
il faut récupérer pagepopup.php
bon ...j'ai bossé sur une regex qui est pas mal mais qui ne fonctionne pas encore au top :(
j'aurai besoin d'un coup de main pour la paufiner ... pour mes tests j'utilise le code source de la page "lemonde.fr" qui comporte plein de types de liens ou ue page de tests à moi...
voici ma regex
// recuperation de la source
$fichier = fopen($_GET['url'], 'r', false);
$src = '';
while ($str=fread($fichier, 16))
{
$src .= $str;
}
fclose($fichier);
cs_caviar
Messages postés329Date d'inscriptionsamedi 4 janvier 2003StatutMembreDernière intervention29 mars 20152 2 mai 2007 à 20:01
saluté.
il me semble que eregi ne fonctionne pas sur la même base des expressions regulière que preg_match_all
en revanche l'expression qie je cherche pourrait se traduire comme ça
commence par
" ou '
http
ou
./
ou
../
ou
un nom de dossier suivi de slash
continue avec
une chaine de caractère quelconque mais pas d'espace
continue avec
un point suivi d'une extension parmis htm, html, php, php3, php4, php5, asp (à compléter...)
suivi éventuellement par un ?
suivi par une chaine de caractère sans espaces
termine par "ou ' (obligatoirement le même qu'au debut)
en gros avec ça on doit pouvoir exreaire tous les liens ... reste à le formaliser ... même ceux contenus dans les javascript ...
je pense que ce qui cloche dans ma regex (le rincipal pb) est que
(.+?)
signifie toute chaine de caractère ... alors que je voudrai avoir lettres plus chiffres plus _ plus - uniquement
ce qui devrai se traduire par
[a-z0-9-_]* mais quand je rentre ça ça ne marhce pas ... j'obtient un gros vide en sortie...
j'espère qu'un calé en regex pourra m'aiguiller ..
@++
cs_caviar
Messages postés329Date d'inscriptionsamedi 4 janvier 2003StatutMembreDernière intervention29 mars 20152 3 mai 2007 à 00:04
re salut
j'ai testé avec lemonde.fr et il reste des javascript qui passent à travers ...
puis le script ne gère pas tous les cas de figure ... par ex un lien qui commence par un nom de dossier suivi de slash
ou l'extraction d'une url contenue dans cette balise
[javascript:window.open('./dossier/pagepopup.php','newsletter_exemple',
'status=yes,resizable=yes,scrollbars=yes,width=610,height=500');
void(0); Titres
du jour]
je pense qu'on peut y arriver avec juste une regex bien pensée ... du moment que la syntaxe du lien est correcte c'est forcément possible de la détecter ...
Je continuerai de chercher demain de toutes façons mais je pense que j'ai besoin d'aide sur ce coup là ;)
j'ai cherché sur le web bien sur mais je n'ai trouvé que des regex basiques ne prenant pas en compte tout les styles de liens expliqués ci avant ...
ya un challenge là :) lol ^^
bon allé faut dormir à un moment donné !
@++ et merci pour ton script en tout cas !
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 3 mai 2007 à 18:23
Si je puis me permettre... Le seul handicap de ton expression régulière, c'est qu'elle cherche spécifiquement des pages.
Et t'es pas à l'abri qu'un lien soit de la forme :
http://www.monsite.com/mapage.bidule
Si je dis à mon serveur que les extensions .bidule doivent être interprétés par telle ou telle application (php, jsp, asp, python, shell,...) ton extracteur ne les trouvera pas. Et c'est ballot...
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 3 mai 2007 à 21:15
Woua avec une expression régulière comme çà ton serveur doit bien galerer lol
<?php
$fp = fopen($_GET['url'], 'r', FALSE);
if ($fp !== FALSE) {
$temp = '';
while (!feof($fp)) $temp .= fgets($fp, 4096);
fclose($fp);
preg_match_all('``sim', $temp, $templink);
$i = -1;
$link = array();
while (isset($templink[1][++$i])) {
if (substr($templink[1][$i], 0, 7) === 'http://' OR substr($templink[1][$i], 0, 8) === 'https://') $link[] = $templink[1][$i];
else{
$explode = explode('#', $templink[1][$i]);
$explode = explode('?', $explode[0]);
$type1 = substr($explode[0], -3);
$type2 = substr($explode[0], -4); if ($type1 'asp' OR $type1 'htm' OR $type1 === 'php' OR $type2 === 'aspx' OR $type2 === 'xhtml' OR $type2 === 'php3' OR $type2 === 'php4' OR $type2 === 'php5') {
if (substr($templink[1][$i], 0, 1) === '/') $link[] = $_GET['url'].substr($templink[1][$i], 1);
elseif (substr($templink[1][$i], 0, 2) === './') $link[] = $_GET['url'].substr($templink[1][$i], 2);
}
}
}
print_r($link);
}
?>
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 3 mai 2007 à 21:57
MDR
Je suis pas sûr qu'une seule Expression Régulière (surtout une regex posix) soit moins performante qu'une série de 3 à 8 substr() et de je ne sias pas combien d'explode(), sans compter tous les tests et boucles...
cs_caviar
Messages postés329Date d'inscriptionsamedi 4 janvier 2003StatutMembreDernière intervention29 mars 20152 3 mai 2007 à 23:44
saluté :)
je vois avec enthousiasme que le sujet à intéréssé du monde ...
j'ai pas testé de benchmark mais je pense aussi que la regex est plus rapide ...
pour extraire les liens du type
http://www.monsite.com/mapage.bidule ou les liens réécrits pour de l'url rewriting j'ai utilisé une autre regex un peu plus permissive (quoique) ...
puis un petit array_unique(arraymerge($tab1,$tab2)); et hop ...que les liens uniques ;)
ça marche bien ...
si ça vous intéresse de tester je vous envoie demaine une page de test avec tous les types d'url possibles et imaginables à extraire :)
plus de mauvaises syntaxes à éviter :)
pour infos deux bonnes pages à tester pour avoir des liens différents sont scoopeo.com et lemonde.fr
le code source que je vous envoie demain est aussi sympathique ;)
Voili voilo ;)
@++
[toto.php1?osCsid=13854354 toto] <- mauvais lien
[toto.xml toto]
[toto.css toto]
[toto.jpg toto]
[toto.gif toto]
toto toto
[dossier/toto.xml'osCsid=13854354 toto]
[javascript:window.open('/presidentielles2007/la-loi-fillon-ne-suffisent-pas-a-tenir-jusquen-2020','newsletter_exemple', 'status=yes,resizable=yes,scrollbars=yes,width=610,height=500'); void(0); Titres du jour ] : Du lundi au vendredi, les titres de l'actualité développés sur Le Monde.fr.
[javascript:window.open('http://www.lemonde.fr/web/newsletter_exemple/0,30-0,62-0@60-5@45-2,0.html','newsletter_exemple', 'status =yes,resizable= yes,scrollbars=yes,width=610,height=500'); void(0); Titres du jour ] : Du lundi au vendredi, les titres de l'actualité développés sur Le Monde.fr.
[javascript:window.open('dossier/newsletter_exemple/0,30-0,62-0@60-5@45-2,0.html','newsletter_exemple', 'status =yes,resizable= yes,scrollbars=yes,width=610,height=500'); void(0); Titres du jour ] : Du lundi au vendredi, les titres de l'actualité développés sur Le Monde.fr.
[javascript:window.open('pagepopup.php','newsletter_exemple', 'status =yes,resizable= yes,scrollbars=yes,width=610,height=500'); void(0); Titres du jour ] : Du lundi au vendredi, les titres de l'actualité développés sur Le Monde.fr.
/ ... , yo ~#{[|`\^@]} &é"' (-è_çà )= salut toi !
document documents documents je tu il nous vous ils
mericredi meri emerider mer mer documentaire documentaire
lien avec ./ [./pagepointslash.php pslh]
lien avec ../ [../pagepointpointslash.php pslh]
lien avec truc/pahe.php [dossier/pagesh.php pslh]
lien avec trucmaj/pahe.php [DOSSIER/pagesh.php pslh]
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 4 mai 2007 à 13:10
Je viens de tester et je vois que ma méthode est plus rapide
(Les expressions régulières c'est beau mais en vouloir faire trop avec n'est pas forcement bon ...)
De plusmon code contient un boucle de 3 à 8 "substr" et de temps en temps 2 "explode" mais il ne faut pas oublier qu'il "nettoye" l'URL pour pouvoir être plus facilement utilisées.
Voilà le code qui m'a permis de tester (pas le temps de mettre des couleurs lol) :
"<?php
$fp = fopen($_GET['url'], 'r', FALSE);
if ($fp !== FALSE) {
$temp = '';
while (!feof($fp)) $temp .= fgets($fp, 4096);
fclose($fp);
// Test Bench pour l'expression régulière.
$time = microtime(true);
preg_match_all('%(("|\')([a-z0-9-_]*|(https?\://|\./|\.\./|/?[a-z0-9-_]*/)[-A-Z0-9+&@#/=?_|!:,.;\%]*)(\.)(php[2-5]?|x?html?|aspx?){1}(\?[-A-Z0-9+&@#/=~_|!:,.;\%]*)?("|\'))%i', $temp, $link);
echo 'Temps de la méthode avec "REGEX POSIX" : ',microtime(true)-$time,"
\n";
// Test Bench pour la méthode "substr".
$time = microtime(true);
preg_match_all('``sim', $temp, $templink);
$i = -1;
$link = array();
while (isset($templink[1][++$i])) {
if (substr($templink[1][$i], 0, 7) === 'http://' OR substr($templink[1][$i], 0, 8) === 'https://') $link[] = $templink[1][$i];
elseif (substr($templink[1][$i], 0, 1) === '?') $link[] = $_GET['url'].$templink[1][$i];
else{
$explode = explode('#', $templink[1][$i]);
$explode = explode('?', $explode[0]);
$type1 = substr($explode[0], -3);
$type2 = substr($explode[0], -4); if ($type1 'asp' OR $type1 'htm' OR $type1 === 'php' OR $type2 === 'aspx' OR $type2 === 'xhtml' OR $type2 === 'php3' OR $type2 === 'php4' OR $type2 === 'php5') {
if (substr($templink[1][$i], 0, 1) === '/') $link[] = $_GET['url'].substr($templink[1][$i], 1);
elseif (substr($templink[1][$i], 0, 2) === './') $link[] = $_GET['url'].substr($templink[1][$i], 2);
}
}
}
echo 'Temps de la méthode avec "substr" : ',microtime(true)-$time,"
\n";
}
?>"