Occurence dans chaine de caractères

Résolu/Fermé
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 - 19 nov. 2016 à 16:15
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 - 24 nov. 2016 à 08:50
Bonjour à tous,

Je cherche à extraire et à afficher, une partie d'un site dans une page d'un autre site.

J'utilise la fonction PHP file_get_contents() pour désigner la page concernée et les fonctions PHP substr(), strpos() et strrpos() pour préciser la partie concernée.

Voici le code que j'utilise :

$annonces = file_get_contents('http://www.xxxxxx.fr');

$annonces = substr($annonces, strpos($annonces, '<div class="module mod_wistr3_annonces">'), strrpos($annonces, '</div>'));

echo $annonces;


Ce code fonctionne très bien pour extraire et afficher ce que je veux, mais il extrait et affiche aussi le reste de la page qui suit ce qui m'intéresse.

Je souhaiterais pouvoir limiter la capture au contenu de la <div> en question. Il y a malheureusement de nombreuses <div> imbriquées et le script semble retenir la dernière </div> de la page.

J'ai essayé de limiter la sélection avec un offset négatif, sans aucun résultat. Si je mets -18108, tout s'affiche et si je mets -18109, il n'y a plus rien qui s'affiche. Je ne dois pas faire comme il faut.

$annonces = file_get_contents('http://www.xxxxxx.fr');

$annonces = substr($annonces, strpos($annonces, '<div class="module mod_wistr3_annonces">'), strrpos($annonces, '</div>', -18108));

echo $annonces;


Merci par avance pour vos réponses et solutions éventuelles.




A voir également:

2 réponses

dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 1 451
20 nov. 2016 à 13:27
J'ai trouvé une solution qui semble fonctionner. Ce qui est étonnant c'est que la solution n'est pas tout à fait la même pour les deux sites concernés. Reste à voir si ça fonctionnera encore, après une mise à jour des sites.

Voici les solutions :

$site = file_get_contents('http://www.xxxxxxx.fr');

$annonces = substr($site, strpos($site, '<div class="module mod_wistr3_annonces">'), -1922);

echo $annonces; 


$site = file_get_contents('http://www.xxxxxx.com');

$annonces = substr($site, strpos($site, '<div class="module mod_wistr3_annonces">'), 2495);

echo $annonces;


Merci encore à Whismerll, même si ce n'est pas sa solution que j'utilise.
1
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
20 nov. 2016 à 13:45
De rien du coup!
0
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 1 451
20 nov. 2016 à 16:40
J'ai quand même trouvé le moyen d'avoir le même code pour les deux sites :

$site = file_get_contents('http://www.xxxxxxx.fr');

$annonces = substr($site, strpos($site, '<div class="module mod_wistr3_annonces">'), 2560);

echo $annonces; 


$site = file_get_contents('http://www.xxxxxx.com');

$annonces = substr($site, strpos($site, '<div class="module mod_wistr3_annonces">'), 2560);

echo $annonces;
0
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 1 451 > dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021
Modifié par dugenou le 24/11/2016 à 09:33
Pour ceux qui seraient intéressés, comme je le redoutais, la mise à jour de la partie de page à capturer a poser un problème, la chaîne est devenue plus longue. Pour régler ce problème, j'ai déterminé la fin de la chaîne en comptant les caractères en partant de la fin et non du début, la fin ne devant pas être modifiée lors des mises à jour (pour compter les caractères, j'ai utilisé une fonction de l'éditeur Geany). Pour décompter de la fin, il faut utiliser un chiffre négatif :

$site = file_get_contents('http://www.xxxxxxx.fr');

$annonces = substr($site, strpos($site, '<div class="module mod_wistr3_annonces">'), -2145);

echo $annonces; 
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
19 nov. 2016 à 17:25
Bonjour
tu peux le faire avec une regex.

0
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 1 451
19 nov. 2016 à 17:54
Merci pour ta réponse.

Je regarde en quoi ça consiste.

Je ne sais pas s'il faut l'utiliser pour sélectionner ce que je veux extraire ou si je dois l'utiliser pour exclure ce que je ne veux pas extraire, mais dans les deux cas, ça me semble assez complexe, car il y a beaucoup de caractères à définir.

Mais, je n'ai pas encore compris comment ça fonctionne vraiment.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
19 nov. 2016 à 18:07
Plutôt pour sélectionner ce que tu veux, regarde cet exemple
http://regexstorm.net/...
0
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 1 451 > Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024
19 nov. 2016 à 18:24
Merci, ça me semble un peu plus clair.
0
Whismeril Messages postés 19021 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 16 avril 2024 928
19 nov. 2016 à 18:34
Apres je ne code pas en PHP, donc je ne sais pas comment ça s'implémente pour ce langage.
Il y a des sites pour tester les Regex au "format" php
0
dugenou Messages postés 6087 Date d'inscription mercredi 19 janvier 2005 Statut Contributeur Dernière intervention 30 juillet 2021 1 451
Modifié par dugenou le 20/11/2016 à 07:51
J'avais commencé avec preg_match sans savoir qu'il s'agissait de regex, mais je n'avais pas réussi à faire ce que je voulais, probablement parce que je ne maîtrise pas cette technique.

Je vais essayer d'utiliser mon script, qui fonctionne en partie, en utilisant en complément preg_replace pour supprimer ce qui s'affiche en trop.
0