Regex & balise HTML

NicoViz
Invité n'ayant pas de compte PHPfrance

24 févr. 2009, 15:56

Salut à tous, j'essaye de coder un robot de référencement. J'utilise file_get_contents() pour obtenir le code source fonction preg_replace() pour trouver les infos (titre, description, mots-clés, langue, et les liens). Problème : Mes regex ne fonctionnent pas et j'enregistre tout le code source au lieu d'isoler uniquement ce qui est entre les <title></title> ou <meta> par exemple.

Voici mes regex:
$source=file_get_contents($site); // On récupère le code source

$titre=preg_replace('#<title>(.+)</title>#i', '$1', ''.$source.''); // On capture le titre du site

$description=preg_replace('#<head>.*<meta name="description" content="(.+)" *>.*</head>#i', '$1', ''.$source.''); // On capture la description contenue dans la balise meta

$motcle= preg_replace('#<meta name="keywords" content="(.+)" />#i', '$1', ''.$source.''); // On capture les mots clés

$langue= preg_replace('#<meta name="language" content="(.+)" />#i', '$1', ''.$source.''); // On capture la langue

ViPHP
ViPHP | 4039 Messages

24 févr. 2009, 16:05

C'est parce que le . est avare. Plutôt que de s'arrêter au premier ", il continue jusqu'au dernier.

Le mieux, c'est d'optimiser le tout en utilisant un sélecteur négatif:

Ceci:

Code : Tout sélectionner

#<meta name="keywords" content="(.+)" />#i
Se transforme alors en ceci:

Code : Tout sélectionner

#<meta name="keywords" content="([^"]+)" />#i
En gros, on captue tout jusqu'au prochains guillemets. Facile, rapide, efficace.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

NicoViz
Invité n'ayant pas de compte PHPfrance

24 févr. 2009, 16:28

Salut, merci pour ta réponse. Malheureusement j'ai toujours le même problème. Ca m'enregistre tout, du doctype au </html>.

ViPHP
ViPHP | 4039 Messages

24 févr. 2009, 16:31

C'est sur.

Je me demande ce qui te pousse à utiliser preg_replace() , une fonction pour remplacer des données, pour extraire des données.

preg_match_all()est plus indiqué, je pense. :wink:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

NicoViz
Invité n'ayant pas de compte PHPfrance

24 févr. 2009, 16:49

Ok, j'ai donc
preg_match_all('#<meta name="keywords" content="([^"]+)" />#i', ''.$source.'', $array_motcle);
Mais la fonction retourne quoi exactement? J'ai du mal à saisir comment récupérer ça.

NicoViz
Invité n'ayant pas de compte PHPfrance

24 févr. 2009, 18:32

Personne pour m'expliquer la syntaxe de la fonction?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

24 févr. 2009, 19:20

Personne pour m'expliquer la syntaxe de la fonction?
Tu as essayé de demander au manuel php ? En général il fait ça très bien ;)

:arrow: preg_match_all()
Liste de paramètres

pattern
Le masque à chercher, sous la forme d'une chaîne de caractères.

subject
La chaîne d'entrée.

matches
Tableau contenant tous les résultats, dans un tableau multidimensionnel ordonné suivant le paramètre flags .

...

Valeurs de retour
Retourne le nombre de résultats qui satisfont le masque complet, ou FALSE si une erreur survient.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

24 févr. 2009, 19:43

Oui j'y suis allé, j'avais pas compris mais finalement j'ai réussi grâce à un autre site, en tout cas merci à toi tu m'as bien dépanné :)