Page 1 sur 1

Regex & balise HTML

Posté : 24 févr. 2009, 15:56
par NicoViz
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

Posté : 24 févr. 2009, 16:05
par Berzemus
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.

Posté : 24 févr. 2009, 16:28
par NicoViz
Salut, merci pour ta réponse. Malheureusement j'ai toujours le même problème. Ca m'enregistre tout, du doctype au </html>.

Posté : 24 févr. 2009, 16:31
par Berzemus
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:

Posté : 24 févr. 2009, 16:49
par NicoViz
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.

Posté : 24 févr. 2009, 18:32
par NicoViz
Personne pour m'expliquer la syntaxe de la fonction?

Posté : 24 févr. 2009, 19:20
par Ryle
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.

Posté : 24 févr. 2009, 19:43
par Invité
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é :)