Avatar billede morten-1981 Nybegynder
10. juni 2008 - 18:18 Der er 12 kommentarer og
1 løsning

Hente en del af indholdet fra string

Jeg har en string, der indeholder en masse oplysninger og blandt andet nedenstående kombination 50 gange.

Hvordan henter jeg smartest følgende tre variabler:
dd-dd-dd
xx
yy


<tr bgcolor="#FFFFFF">
<td width="28%" class="tablesmall" bgcolor="#EEEEEE" >
dd-dd-dd&nbsp;</td>
<td width="26%" class="tablesmall" bgcolor="#EEEEEE">xx</td>
<td width="26%" class="tablesmall" bgcolor="#EEEEEE">yy</td>
<td width="17%" align="center" class="tablesmall" bgcolor="#EEEEEE">v</td>
<td width="3%" bgcolor="#EEEEEE">info</td>
</tr>


Jeg vil gerne kunne kører min string igennem og så udskrive de tre værdier hver gang jeg støder på dem. Jeg har læst så meget jeg kan finde dog uden selv at kunne sammensætte en løsning.

Er pt. ude i at eksperimentere med tokenizin som skal have en løkke smidt ind:
http://www.unix.com.ua/orelly/webprog/php/ch04_07.htm
... det virker dog ikke til at være den korrekte til formålet.
Avatar billede jakobdo Ekspert
10. juni 2008 - 19:48 #1
Du kan prøve følgende:

preg_match_all('!<tr bgcolor="#FFFFFF">
<td width="28%" class="tablesmall" bgcolor="#EEEEEE" >
(\w{2}-\w{2}-\w{2})&nbsp;</td>
<td width="26%" class="tablesmall" bgcolor="#EEEEEE">(\w{2})</td>
<td width="26%" class="tablesmall" bgcolor="#EEEEEE">(\w{2})</td>
<td width="17%" align="center" class="tablesmall" bgcolor="#EEEEEE">v</td>
<td width="3%" bgcolor="#EEEEEE">info</td>
</tr>!', $input, $output);

echo '<pre>';
print_r($output);
echo '</pre>';
Avatar billede morten-1981 Nybegynder
10. juni 2008 - 21:43 #2
Hej Jakob. Tak for din hjælp, det sætter jeg stor pris på.

Det printer følgende:

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
        )

    [2] => Array
        (
        )

    [3] => Array
        (
        )

)


Jeg ved ikke hvor lang XX og YY er, men dd-dd-dd er altid samme format. Kan man ikke få den til at tage alt mellem de tre typer start og så </td>? Så bruge ex ""<td width="28%" class="tablesmall" bgcolor="#EEEEEE" > som markør for at den skal starte og </td> som en slags markør for at den skal stoppe.
Avatar billede jakobdo Ekspert
10. juni 2008 - 22:08 #3
Har du evt. et link til den side du vil rippe ?
Avatar billede morten-1981 Nybegynder
10. juni 2008 - 22:15 #4
Ja, her: http://masl.dk/97d0ceff
vil selvfølgelig ikke så gerne skilte med den :)

Jeg bruger den simpleste funktion, som jeg har kunnet finde i PHP:

$content = file_get_contents("min-url");
Avatar billede coderdk Praktikant
10. juni 2008 - 23:40 #5
Prøv:

$pat = '@<tr.*?F">.*?E"\s*>.*?([0-9-]+).*?E">(.*?)</.*?E">(.*?)</t.*?E">(.*?)</.*?href="(.*?)">.*?</tr>@si';
if ( preg_match_all( $pat, $content, $m ) )
{
    $n = count( $m[1] );
    for ( $i = 0; $i < $n; $i++ )
    {
        echo $m[1][$i] . " - " . $m[2][$i] . " - " . $m[3][$i] . " - " . $m[4][$i] . " - " . $m[5][$i] . "<br />";
    }
}
else
{
    echo "Fandt intet";
}
Avatar billede morten-1981 Nybegynder
11. juni 2008 - 00:25 #6
Den virker helt perfekt - mange tak. Kan jeg lokke dig til at kommenterer linjerne, så jeg får en forståelse for hvordan det virker? Og smid lige et svar samtidig.
Avatar billede coderdk Praktikant
11. juni 2008 - 01:35 #7
Tjah, der er ikke så meget at forklare ;) Det kræver lidt PCRE-øvelse... Du kan evt. google efter regular expression tutorial eller pcre tutorial

$pat = '@<tr.*?F">.*?E"\s*>.*?([0-9-]+).*?E">(.*?)</.*?E">(.*?)</t.*?E">(.*?)</.*?href="(.*?)">.*?</tr>@si';
// Her finder vi de interessante <tr>...</tr> med indhold og grupper dem () så vi kan hente dem ud - jeg bruger switchene "si" - "s" for at . også kan være newline og "i"
for case insensitivity
// I.e. <tr.*?F"> matcher <tr bgcolor="#FFFFFF"> osv
if ( preg_match_all( $pat, $content, $m ) )
{
    // Vi fandt noget :)
    $n = count( $m[1] ); // Hvor mange rækker?
    for ( $i = 0; $i < $n; $i++ )
    {
        // Her looper vi bare igennem resultaterne og skriver dem ud
        echo $m[1][$i] . " - " . $m[2][$i] . " - " . $m[3][$i] . " - " . $m[4][$i] . " - " . $m[5][$i] . "<br />";
    }
}
else
{
    echo "Fandt intet";
}
Avatar billede morten-1981 Nybegynder
12. juni 2008 - 18:24 #8
Det skal jeg hvis have læst lidt mere på, men det bliver meget lettere når jeg har et virkende eksempel at tage udgangspunkt i. Mange tak for jeres tid :)
Avatar billede morten-1981 Nybegynder
13. juni 2008 - 22:24 #9
Hvad hvis jeg gerne vil udvide til at have klokkeslet med?
Det er den her jeg skal have fat i, såvidt jeg kan regne ud: ([0-9-]+)

Den angiver at det skal være tal mellem 0 og 9 samt bindestrege, der medtages(?)

Det den også skal medtage er kolon og mellemrum. Jeg kan læse mig til at whitespace er \s, men synes ikke at jeg kan kombinere det med ":" på en måde, der giver mening.

Håber du vil besvare sådan et lille opfølgningsspørgsmål :)
Avatar billede coderdk Praktikant
13. juni 2008 - 22:52 #10
erstat

$pat = '@<tr.*?F">.*?E"\s*>.*?([0-9-]+).*?E">(.*?)</.*?E">(.*?)</t.*?E">(.*?)</.*?href="(.*?)">.*?</tr>@si';

med

$pat = '@<tr.*?F">.*?E"\s*>.*?([ :0-9-]+).*?E">(.*?)</.*?E">(.*?)</t.*?E">(.*?)</.*?href="(.*?)">.*?</tr>@si';
Avatar billede morten-1981 Nybegynder
13. juni 2008 - 23:27 #11
Det ligner noget der burde virke nu hvor de to ekstra tegn er med, men den tager stadig kun dato uden klokkeslet.
Avatar billede coderdk Praktikant
14. juni 2008 - 00:48 #12
start lige med denne linje:

$contnet = str_replace( "&nbsp;", " ", $content );

så burde det virke ;)
Avatar billede morten-1981 Nybegynder
14. juni 2008 - 10:16 #13
Yes, perfekt - mange tak :)
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