Avatar billede cronick Nybegynder
08. juli 2007 - 18:23 Der er 14 kommentarer og
1 løsning

preg_match vil ikke finde det den skal

Hej,

Hvis vi nu siger jeg har denne kildekode (sideindhold):

          <td width="180"><b>&nbsp;Navn:</b><br>
      <div style="width:170px; overflow:hidden; margin-left:4px;">Anders</div></td>
        </tr>
        <tr>
          <td><b>&nbsp;Alder: </b><br>
            &nbsp;17</td>

Så vil jeg gerne have det ud med dette:

<?php

  $side= "min side.htm";
  $lines = file($side);
  foreach ($lines as $line_num => $line) {

        if(preg_match("/<div style=\"width:170px; overflow:hidden; margin-left:4px;\">(.*)<\/div>/", $line, $navn_array)) {
    $navn = $navn_array['1'];
    }

    if(preg_match("/<td><b>&nbsp;Alder: <\/b><br>(.*)&nbsp;(.*)<\/td>/", $line, $alder_array)) {
    $alder = $alder_array['2'];
    }

  }

?>

Så vil ingen af de to preg_matcher'er, at finde noget, og derved udskrive det. Har en anden, som virker, så det er ikke noget med sidens adresse, eller lign.

Nogen der lige kan spotte de to fejl?

- På forhånd tak!
Avatar billede jakobdo Ekspert
09. juli 2007 - 08:24 #1
Er du sikker på din kildekode er korrekt?
Der er jo forskel på mellemrum, tabs, newlines osv...
Avatar billede cronick Nybegynder
09. juli 2007 - 16:53 #2
Hvad mener du? Det du ser øverst er den kildekode jeg forsøger at trække ud..
Avatar billede jakobdo Ekspert
09. juli 2007 - 19:32 #3
Så skulle din kode ellers også være ok.
Avatar billede nielle Nybegynder
09. juli 2007 - 19:53 #4
Jeg ved faktisk ikke om det vil gøre en forskel, men du bør ændre:

$navn = $navn_array['1'];

- til:

$navn = $navn_array[1];

Indekset er et tal, ikke en tekst.
Avatar billede cronick Nybegynder
15. juli 2007 - 18:50 #5
Okey, men det ændrede ikke rigtig noget. Hm, der må jo altså være nogle fejl, siden den ikke finder noget?
Avatar billede jakobdo Ekspert
15. juli 2007 - 18:53 #6
Har du et direkte link til den side du henter data fra?
Så kan jeg prøve at lave noget kode på min server og teste?
Avatar billede cronick Nybegynder
16. juli 2007 - 11:01 #7
Siden til højre, i iframen, på denne side:
http://www.n.dk/frameset.asp?right=/community/user2/profile/frProfile.asp?userId=2563156

Jeg har kun kunnet få lvl til at virke - siden er:
http://shocknews.dk/community/hhprofile.php?brugernavn=Cronick

Koden har du jo nogenlunde øverst, men måden jeg henter lvl'et er således (og altså den eneste af mine metoder, som virker som det skal):
    if(preg_match("/Images\/buttons\/level\/(.*)\.gif/", $line, $level_array)) {
    $level = $level_array['1'];
    }
Avatar billede jakobdo Ekspert
16. juli 2007 - 20:08 #8
Prøv denne:

$url = 'http://www.n.dk/community/user2/profile/frProfile.asp?userId=2563156';

$content = file_get_contents($url);
if(preg_match('%<div\sstyle="width:170px;.+?>(.+?)</div>.+?Alder.+?(\d+)%s', $content, $match))
{
    $navn = $match[1];
    $alder = $match[2];
    echo 'Navn : ' . $navn . '<br />';
    echo 'Alder : ' . $alder . '<br />';
}
Avatar billede cronick Nybegynder
16. juli 2007 - 20:35 #9
Fandt problemet.. Jeg havde åbenbart brugt en side, hvor kun lvl'et indegik. Derfor kunne den ikke finde ens navn m.m - problemet er bare, at hvor alderen skal findes, der skal man jo egentlig bruge to linier, men metoden her kører igennem linie for linie. Har så prøvet at lave en session med den sidste linie, og derved tilføjet til til alderen, således:

if(preg_match("/<td><b>&nbsp;Alder: <\/b><br>(.*)&nbsp;(.*)<\/td>/", $_SESSION['sidste_linie'].$line_two, $alder_array)) {
    $alder = $alder_array['2'];
}

Dette virker bare ikke - den finder ikke noget..
Avatar billede cronick Nybegynder
16. juli 2007 - 20:37 #10
Nej - min metode går ikke rigtig, da den derved kun kan finde noget over to linier maks. Prøver lige din metode..
Avatar billede cronick Nybegynder
16. juli 2007 - 20:55 #11
Din metode virker jo som den skal.. :)

Dette er hvad jeg har nu (efter jeg har tilføjet endnu en "match", til lvl):

  $url = 'http://www.n.dk/community/user2/profile/frProfile.asp?userId=2563156';

  $content = file_get_contents($url);

  if(preg_match('%\/Images\/buttons\/level\/(\d+).+?<div\sstyle="width:170px;.+?>(.+?)</div>.+?Alder.+?(\d+)%s', $content, $match)) {
    $level = $match[1];
    $navn =  $match[2];
    $alder = $match[3];
  }

Så tænkte jeg på - skal jo ind og tilføje omkring yderligere 8 "matches". Det bliver jo derved virkelig uoverskueligt at se på. Kan man ikke opstille det på en måde, som går det mere overskueligt, i stedet for bare én lang smøre derudaf? :)
Avatar billede jakobdo Ekspert
16. juli 2007 - 21:16 #12
Jeg ved faktisk ikke om man kan lave noget generic.
Det kræver jo at alle data er opsat på samme måde.
Avatar billede cronick Nybegynder
17. juli 2007 - 01:18 #13
Okey.. Har selv fundet på noget, som måske ikke er vildt effektivt, men får det hvert fald til at se mere overskueligt ud, da man herved kan skifte linie:

  if(preg_match('%\/Images\/buttons\/level\/(\d+).+?[
                ]?<div\sstyle="width:170px;.+?>(.+?)</div>.+?[
                ]?Alder.+?(\d+).+?[
                ]?Bop&aelig;l:.+?&nbsp;(.+?)<\/td>%s', $content, $match)) {

Anyway .. Det hele virker fint nu, så tak.. Du er velkommen til at smide et svar.. ;)
Avatar billede jakobdo Ekspert
17. juli 2007 - 16:43 #14
Svar!
Avatar billede jakobdo Ekspert
18. juli 2007 - 06:59 #15
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester