2008-10-21 5 views
1

Je suis en utilisant le code suivant:expression régulière Soi-disant valide ne retourne pas de données en PHP

<?php 
$stock = $_GET[s]; //returns stock ticker symbol eg GOOG or YHOO 
$first = $stock[0]; 

$url = "http://biz.yahoo.com/research/earncal/".$first."/".$stock.".html"; 
$data = file_get_contents($url); 

$r_header = '/Prev. Week(.+?)Next Week/'; 
$r_date = '/\<b\>(.+?)\<\/b\>/'; 

preg_match($r_header,$data,$header); 
preg_match($r_date, $header[1], $date); 

echo $date[1]; 
?> 

J'ai vérifié les expressions régulières here et ils semblent être valides. Si je vérifie seulement $ url ou $ data, ils ressortent correctement et si j'imprime $ data et que je vérifie la source, le code que je cherche à utiliser dans l'expression rationnelle est là. Si vous êtes intéressé à vérifier quelque chose, un exemple d'une URL correcte serait http://biz.yahoo.com/research/earncal/g/goog.html

J'ai essayé tout ce que je pouvais penser, y compris var_dump ($ header) et var_dump ($ date), qui retournent tous les deux tableaux vides.

J'ai été capable de créer d'autres expressions régulières qui fonctionnent. Par exemple, ce qui suit renvoie correctement "Gains":

$r_header = '/Company (.+?) Calendar/'; 
preg_match($r_header,$data,$header); 
echo $header[1]; 

Je suis en train d'essayer de comprendre pourquoi cela ne fonctionne pas. Toute aide serait géniale. Merci.

Répondre

3

Le problème est que le HTML a des sauts de ligne dans ce, que vous devez incorporer avec le modificateur regex s, comme ci-dessous

<?php 
$stock = "goog";//$_GET[s]; //returns stock ticker symbol eg GOOG or YHOO 
$first = $stock[0]; 

$url = "http://biz.yahoo.com/research/earncal/".$first."/".$stock.".html"; 
$data = file_get_contents($url); 

$r_header = '/Prev. Week(.+?)Next Week/s'; 
$r_date = '/\<b\>(.+?)\<\/b\>/s'; 


preg_match($r_header,$data,$header); 
preg_match($r_date, $header[1], $date); 

var_dump($header); 
?> 
0

Je pense que c'est parce que vous appliquez les valeurs à la regex comme si c'était du texte brut. Cependant, c'est du HTML. Par exemple, votre regex devrait être modifié pour analyser:

<a href="...">Prev. Week</a> ...

ne pas Parse le texte brut régulier comme: «Précédent semaine .... »

4

Votre regex ne permet pas la ligne pauses dans le HTML Essayez:

$r_header = '/Prev\. Week((?s:.*))Next Week/'; 

le s lui dit de faire correspondre les sauts de ligne dans le . (correspond tout).

2
  1. Le point ne correspond pas aux nouvelles lignes par défaut. Utilisez /your-regex/s
  2. $r_header devrait probablement /Prev\. Week(.+?)Next Week/s
  3. Pour votre information: Vous n'avez pas besoin d'échapper < et > dans un regex.
2

Vous voulez ajouter le modificateur s (PCRE_DOTALL). Par défaut . ne correspond pas à newline, et je vois que la page les a entre les deux parties que vous recherchez.

Side note: bien qu'ils ne font pas mal (sauf la lisibilité), vous n'avez pas besoin d'une barre oblique inverse avant < et >.

Questions connexes