2008-11-29 8 views
0

J'essaie de gratter un prix à partir d'une page Web en utilisant PHP et Regexes. Le prix sera au format £ 123,12 ou $ 123,12 (c'est-à-dire, livres ou dollars).Grattez un prix sur un site Web

Je charge le contenu en utilisant libcurl. La sortie de ce qui va ensuite dans preg_match_all. Donc, il ressemble un peu à ceci:

$contents = curl_exec($curl); 

preg_match_all('/(?:\$|£)[0-9]+(?:\.[0-9]{2})?/', $contents, $matches); 

Jusqu'ici si simple. Le problème est que PHP ne correspond à rien - même s'il y a des prix sur la page. Je l'ai réduit à un problème avec le caractère '£' - PHP ne semble pas aimer ça. Je pense que cela pourrait être un problème de charset. Mais quoi que je fasse, je n'arrive pas à trouver PHP pour le faire correspondre! Quelqu'un a des idées?

(Edit: Je dois signaler si j'essayer d'utiliser le Regex Test Tool en utilisant la même regex et contenu de la page, il fonctionne très bien)

Répondre

1

Avez-vous essayez d'utiliser \ devant

£
preg_match_all('/(\$|\£)[0-9]+(\.[0-9]{2})/', $contents, $matches); 

I J'ai essayé cette expression avec .Net avec \ £ et cela fonctionne. Je l'ai juste édité et ai enlevé quelques ":". alt text http://clip2net.com/clip/m12122/1227972904-clip-9kb.png

Lire mon commentaire sur la possibilité de Curl vous donnant un mauvais encodage (commentaire de ce post).

+0

Ne fonctionne pas, malheureusement :( –

+0

J'ai modifié la regex et supprimé quelques autres choses.Vérifiez la capture d'écran.Etes-vous sûr que ce n'est pas la façon dont vous utilisez la correspondance après la regex? –

+0

Je viens de remarquer votre modification. le regex fonctionne bien il pourrait être l'encodage de la page de la boucle qui vous donne un problème d'encodage avec $ et £ Vous pourriez vouloir sortir les données de boucle pour le vérifier –

0

peut-être le livre a son remplacement d'entité html? Je pense que vous devriez essayer votre regexp avec une sorte de programme couching (à savoir le faire correspondre à du texte fixe localement).

je changerais mon regexp comme ceci: '/(?:\$|£)\d+(?:\.\d{2})?/'

+0

Merci - J'ai essayé de l'enregistrer localement et il est venu avec une erreur lors de l'ouverture du fichier.Si je convertis la chaîne en utf8, ça marche Je suppose que j'ai juste besoin de détecter le charset. –

0

Cela devrait fonctionner pour les valeurs simples. Cela ne fonctionnera pas avec le séparateur de milliers comme 234, 343 et 34, 454,45.