2010-03-11 3 views
0

J'essaie d'utiliser preg_replace pour obtenir des données à partir d'une page distante, mais j'ai un petit problème quand il s'agit de trier le motif.preg_replace hell

function getData($Url){ 
    $str = file_get_contents($Url); 
    if(strlen($str)>0){ 
     preg_match("/\<span class=\"SectionHeader\"\>title\</span>/<br/>/\<div class=\"header2\"\>(.*)\</div\></span\>/",$str,$title); 
     return $title[1]; 
    } 
} 

Voici le HTML est avant fini par jeter un million de barres obliques à elle (on dirait que j'oublié une partie ou deux):

<span class="cell CellFullWidth"><span class="SectionHeader">mytitle</span><br/><div class="Center">Event Name</div></span> 

Nom de l'événement est les données que je veux retourner dans ma fonction.

Merci beaucoup les gars, c'est une douleur dans le cul.

+0

Je ne toucherais pas à cela avec un poteau de dix pieds. Il doit y avoir un moyen plus efficace d'obtenir le titre que de numériser la page entière pour un match. Vous savez que preg_match retournera un tableau s'il a trouvé plus d'une correspondance pour ce critère, est-ce correct? – animuson

+0

J'utiliserais un analyseur html, tel que http://simplehtmldom.sourceforge.net/ – marvin

+0

Comme tant de fois auparavant sur SO, je recommande de ne pas utiliser d'expressions régulières pour analyser le HTML, car elles ne sont pas adaptées à cela. Utilisez un analyseur HTML à la place. –

Répondre

0

Alors que je suis plutôt d'accord avec les commentateurs que ce n'est pas une solution assez, voici ma révision non vérifiée de votre déclaration:

preg_match('#\<span class="SectionHeader"\>title\</span\>/\<br/\>/\<div class="header2"\>(.*)\</div\>\</span\>#',$str,$title); 

J'ai changé la chaîne entre guillemets à guillemets simples que vous aren n'utilise aucune des fonctions de substitution de variable des chaînes entre guillemets, ce qui évite d'avoir à éviter les guillemets doubles et évite toute ambiguïté sur les barres obliques inverses (qui auraient peut-être dû être doublées pour produire les chaînes appropriées - voir the php manual on strings). J'ai changé le slash/délimiteur en hachage # en raison du nombre de barres obliques apparaissant dans le motif de correspondance (dont certaines ne contenaient pas de barre oblique inverse dans votre version).

0

Il y a bien quelques petites choses mal avec votre expression:

  • Vous utilisez / comme séparateur, mais utiliser / dans divers endroits non échappés. Vous échappez < et > apparemment aléatoire. Ils ne devraient pas être échappés du tout.
  • Vous avez quelques voyous / s autour du <br/> pour une raison quelconque.
  • Le nom de la classe pour la div est spécifié comme header2 dans le regex mais Center dans l'échantillon HTML
  • Le titre est mytitle dans le code HTML et title dans le regex

Avec tous ces corrigés, vous obtenir:

preg_match('(<span class="SectionHeader">mytitle</span><br/><div class="Center">(.*)</div\></span\>)',$data,$t); 

Si vous voulez faire correspondre un titre au lieu du titre spécifique mytitle, il suffit de remplacer que par .*?.