Aller au contenu

REGEX, j'en ch.... !


Sujets conseillés

Posté (modifié)

Bonjour,

Je découvre les REGEX, et disons le clairement, je couine :(

Je cherche à récuperer dans le code d'une page la liste des fichiers CSS externes présents :

define('REGEX_CSS',		 '#^href="([^>]+)/>#i'); 
$target="http://www.site.fr";
$contents = _AT_file_get_contents($target); // recup de contenu de la page
if($results = preg_match_all(REGEX_LINK, $contents, $links, PREG_SET_ORDER))
{
Voila l foreach($links as $tmp_image){
$match = array();
$image_src=$tmp_image[1]; // css à traiter
echo $count_img."css à traiter = ".$image_src."<br>";
}
}

Ce code, lancé dans une page contenant 2 fichiers CSS externes, ne renvoie rien. La REGEX ne trouve pas la chaine...

Les CSS présents dans la page, du classique...

<link rel="stylesheet" type="text/css" href="css/main.css" />

<link rel="stylesheet" type="text/css" href="css/maino.css" />

Un p'tit coup de main SVP ?

Modifié par lorik
Posté

Hello,

ta REGEX commence par "^" indiquant que tu ne cherches qu'au tout début de la chaine ; ce qui n'est évidement pas ton cas.

Posté

Salut Kiob,

le '^", si j'ai bien compris les REGEX (mais j'ai pas compris, c'est sur, sinon je serais pas là), c'est pour dire que la chaine 'href' doit etre en début de chaine dans le texte 'crawlé'.

bref, j'ai mis çà pour que la REGEX ne me sorte pas les AHREF des liens 'classiques'.

Resultat, je viens de tester, effectivement, ça marche sans le '^', merci. Faudra que je relise les tutoriaux, j'étais sur de mon coup pour ce point là :(

Merci.

Posté

Pour ne prendre que les balises "link", il faut le préciser.... y a aucun flag qui va le dire à ta place.

Après faut voir si tu veux qu'on te donne une solution directement ou bien si tu veux te faire la main sur les regex par toi même ;)

Posté

Bonjour,

Et si ton script est destiné à des sources de données variées, sur lesquelles tu n'as pas de contrôle cela va devenir plus compliqué également, parce qu'(x)HTML est assez souple au niveau de l'ordre des attributs, des séparateurs (single quote et double quote). Pour l'ordre des attributs cela revêt une importance car si tu veux récupérer toutes les URL (relatives et absolues) de toutes les balises <link> qui concernes les feuilles de style tu vas devoir vérifier que l'attribut type à bien la valeur "text/css". Il se peut que chercher une seule expression rationnelle pour régler ces problèmes soit plus compliqué que se résoudre à le faire en deux fois par exemple:

  1. Extraction des <link> ayant type="text/css" ou type='text/css'.
  2. Extraction des URL de chacun de ces éléments (de nouveau en prenant en considération les différents séparateurs.

Bonne continuation.

Posté

Pour les CSS, je pense que mon HREF est bon au niveau methode, non ? après, effectivement, je dois tester la présence de l'extention CSS, et ça devrait le faire, je pense, quelque soit l'ordre des attributs, j'aurai toujours l'url juste après le Href, non ? j'ai jamais vu un autre cas, mais tu me mets le doute...

non Kiob, j'aime bien apprendre moi même :) . C'est pas mon boulot de coder, c'est juste un loisir. Alors si j'attends qu'on me donne le code, ou est l'interet ? (quoique, parfois ...:D : puisque t'en parles, t'as pas le code pour trouver les <script src ... > pour les javascripts externes :P )

Posté

Tester la présence de l'extension .css peut paraître suffisante, mais ce n'est pas le cas. Tu peux utiliser n'importe quelle extension pour ton fichier CSS, du moment que tu spécifie l'attribut "type" de ta balise <link>, donc ton test ne fonctionnerait pas dans tous les cas... et l'expression rationnelle que tu utilises (au passage la constante "REGEX_LINK" n'est définie nulle part dans le code que tu as montré, donc je suppose que tu utilises la constante REGEX_CSS en fait) va récupérer toutes les valeurs qui commencent après href=", qui ne contiennent pas le caractère > et qui finissent avant la séquence />, alors que ce que tu souhaites faire, si j'ai bien compris, c'est récupérer tout ce qui se trouve entres les guillemets doubles ou simples de l'attribut href lorsqu'il est spécifié pour la balise <link> (et pas pour les autres balises, du type <a> ou <base> par exemple).

Donc comme l'a dit Kioob, si tu veux limiter ta recherche aux balises <link>, il faut le spécifier à un moment donné dans ton expression rationnelle. Un exemple d'expression rationnelle qui fonctionnerait (si on ne se préoccupe pas de l'attribut type... mais je te conseille de le prendre en compte car l'utilisation de <link> ne se limite pas au feuilles de style) :

preg_match_all("/<link.*\shref=[\"'](.+)[\"'].*\/>/iU",$contents,$matches);

À noter que pour le support des single (') et double quote ("), j'ai créer deux sous-masques (qui permettent plusieurs alternatives qui seront retournés dans le tableau $matches mais qui ne te servirons pas forcément par la suite... c'est juste la méthode la plus simple qui m'est venue à l'esprit en écrivant ceci, à toi de le faire évoluer ;)

L'utilisation de l'option "U" pour le masque, c'est en fait la désactivation du mode gourmand (greedy -> ungreedy), si tu veux plus d'informations à ce sujet : REGEXP multi-lignes en PHP

Posté
c'est juste la méthode la plus simple qui m'est venue à l'esprit en écrivant ceci, à toi de le faire évoluer

Tu veux m'ecoeurer ou quoi ? :) je vois pas ce qu'il y a de simple là dedans, quand je pense que tu me 'ponds' ça comme qui rigole, alors que j'ai mis 4 heures pour faire une REGEX... fausse ! La vie est trop injuste...

Bon merci 1000 fois en tous cas, je vais creuser ça et suivre ta methode.

Posté

Pardon, je ne me référais pas à la trivialité de l'expression rationnelle, mais à la méthode utilisée... je voulais dire qu'il y a sans doute des cas que je n'ai pas prévus, tiens en voilà un, il n'est pas permis de mettre type="css/text' ou type='css/text" et mon expression régulière le permet (enfin c'est pas si grave que cela... à moins qu'il manque un " ou une ' ... dans ce cas la valeur retournée sera erronée ;)

Veuillez vous connecter pour commenter

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



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