/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Regular expressions og subpatterns
Fra : Jonas Delfs


Dato : 26-07-11 07:12

Hej -

Jeg er i gang med at fiske data ud af denne html-tabel:
http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm

For at matche dato + tallet i første data-kolonne gør jeg således: /
(201[0-9]{5})[\s\h]+<\/td>[\s\h]+<td>[\s\h]+([0-9]+)/
Det virker upåklageligt. Men da antallet af data-kolonner kan variere,
skal mit pattern også være dynamisk.

Derfor har jeg forsøgt mig med at sætte parenteser rundt om den del
der matcher data-kolonnen, således: /(201[0-9]{5})([\s\h]+<\/td>[\s\h]
+<td>[\s\h]+([0-9]+))+/
Men så får jeg kun tallet fra sidste kolonne i rækken i mit matches-
array fra preg_match_all()

Der er tydeligvis noget jeg ikke helt forstår ift de her subpatterns.
Hvordan kan jeg opnå det ønskede?

På forhånd tak!

Mvh. Jonas

 
 
Andreas Andersen (26-07-2011)
Kommentar
Fra : Andreas Andersen


Dato : 26-07-11 20:34

On 26-07-2011 15:11, Jonas Delfs wrote:
> Hej -
>
> Jeg er i gang med at fiske data ud af denne html-tabel:
> http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm
>
> For at matche dato + tallet i første data-kolonne gør jeg således: /
> (201[0-9]{5})[\s\h]+<\/td>[\s\h]+<td>[\s\h]+([0-9]+)/
> Det virker upåklageligt. Men da antallet af data-kolonner kan variere,
> skal mit pattern også være dynamisk.
>
> Derfor har jeg forsøgt mig med at sætte parenteser rundt om den del
> der matcher data-kolonnen, således: /(201[0-9]{5})([\s\h]+<\/td>[\s\h]
> +<td>[\s\h]+([0-9]+))+/
> Men så får jeg kun tallet fra sidste kolonne i rækken i mit matches-
> array fra preg_match_all()
>
> Der er tydeligvis noget jeg ikke helt forstår ift de her subpatterns.
> Hvordan kan jeg opnå det ønskede?

Sådan fungerer regulære udtryk i PHP. .NET regulære udtryk kan returnere
flere captures pr. gruppe, men det hjælper dig jo ikke her. Du bliver
nok nødt til at gøre det af flere omgange. Først find hele rækker, og
dernæst løb hver række igennem og find de enkelte kolonner med et andet
regulært udtryk.

--
Andreas

Jonas Delfs (26-07-2011)
Kommentar
Fra : Jonas Delfs


Dato : 26-07-11 17:00

On Jul 26, 9:34 pm, Andreas Andersen <andreas2...@gmail.com> wrote:
> On 26-07-2011 15:11, Jonas Delfs wrote:
>
> > Jeg er i gang med at fiske data ud af denne html-tabel:
> >http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm
>
> > For at matche dato + tallet i f rste data-kolonne g r jeg s ledes: /
> > (201[0-9]{5})[\s\h]+<\/td>[\s\h]+<td>[\s\h]+([0-9]+)/
> > Det virker up klageligt. Men da antallet af data-kolonner kan variere,
> > skal mit pattern ogs v re dynamisk.
>
> > Derfor har jeg fors gt mig med at s tte parenteser rundt om den del
> > der matcher data-kolonnen, s ledes: /(201[0-9]{5})([\s\h]+<\/td>[\s\h]
> > +<td>[\s\h]+([0-9]+))+/
> > Men s f r jeg kun tallet fra sidste kolonne i r kken i mit matches-
> > array fra preg_match_all()
>
> > Der er tydeligvis noget jeg ikke helt forst r ift de her subpatterns.
> > Hvordan kan jeg opn det nskede?
>
> S dan fungerer regul re udtryk i PHP. .NET regul re udtryk kan returnere
> flere captures pr. gruppe, men det hj lper dig jo ikke her. Du bliver
> nok n dt til at g re det af flere omgange. F rst find hele r kker, og
> dern st l b hver r kke igennem og find de enkelte kolonner med et andet
> regul rt udtryk.

Nå, øv. Men tak for svar!

Mvh. Jonas

Andreas Andersen (27-07-2011)
Kommentar
Fra : Andreas Andersen


Dato : 27-07-11 04:55

On 27-07-2011 00:59, Jonas Delfs wrote:
> Nå, øv. Men tak for svar!

Det vil måske være mere effektivt at lave en simpel parser - noget med
at læse hele filen ind i hukommelsen, læse et tegn ad gangen og holde
styr på, hvor du er med en simpel tilstandsmaskine. Men det er
selvfølgelig et lidt større projekt.

--
Andreas

Bertel Lund Hansen (27-07-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-07-11 07:40

Jonas Delfs skrev:

> For at matche dato + tallet i første data-kolonne gør jeg således: /
> (201[0-9]{5})[\s\h]+<\/td>[\s\h]+<td>[\s\h]+([0-9]+)/
> Det virker upåklageligt. Men da antallet af data-kolonner kan variere,
> skal mit pattern også være dynamisk.

Jeg er ikke nopgen ørn til regulære udtryk, så min løsning ville
gå uden om dem.

Hent hele filen ind som et linjearray, søg først på "Pollen-d" og
derefter på "FONT". Overfør linjen med "FONT" samt alle følgende
linjer indtil men ikke med "<table>".

Derefter kan du med to eksplosioner danne et array af arrays med
værdierne fra tabellen som dog på et eller andet tidspunkt skal
trimmes alle sammen.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (28-07-2011)
Kommentar
Fra : Bertel Lund Hansen


Dato : 28-07-11 09:19

Bertel Lund Hansen skrev:

> Hent hele filen ind som et linjearray, søg først på "Pollen-d" og
> derefter på "FONT". Overfør linjen med "FONT" samt alle følgende
> linjer indtil men ikke med "<table>".

Nu lavede jeg lige metoden. Så kan du jo sammenligne med det du
bruger:

$dataurl = 'http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm';

define ('FIRST','Dato');
define ('TABLEEND','</table>');
define ('TRBEGIN','<tr>');
define ('TREND','</tr>');
define ('TDBEGIN','<td>');
define ('TDEND','</td>');

// ---------------- Main ----------------

$filelines = file($dataurl);
for ($nr=0; strpos($filelines[$nr],FIRST)===false; ++$nr);
for (; strpos($filelines[$nr],TREND)===false; ++$nr)
$datalines='';
for (; strpos($line,TABLEEND)===false; ++$nr)
   $datalines.=$filelines[$nr];
$datedata=explode(TRBEGIN,$datalines);
foreach ($datedata as $nr => $data) {
   $data_array=explode(TDBEGIN,$data);
   foreach ($data_array as $n => $dt) $data_array[$n]=trim(strip_tags($dt));
   array_shift($data_array); // Remove first dummy
   $datedata[$nr]=$data_array;
}
array_shift($datedata); // Remove first dummy

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Leif Neland (27-07-2011)
Kommentar
Fra : Leif Neland


Dato : 27-07-11 08:42


>"Jonas Delfs" <jonasdelfs@gmail.com> skrev i en meddelelse
>news:2dd22259-52d9-45f4-a81c-554c2e75d7ac@o18g2000yqm.googlegroups.com...

>Jeg er i gang med at fiske data ud af denne html-tabel:
>http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm

Nu husker du lige:

"Selve pollendata inklusive historiske data er ophavsretligt beskyttet og
privatpersoners, virksomheders, organisationers o.a. brug af data fx til
kommercielt brug i informations- eller salgsøjemed må kun ske efter
forudgående skriftlig aftale med Astma-Allergi Danmark og Danmarks
Meteorologiske Institut."

Men hvis det ikke er til kommercielt brug, går det vel. Men check lige for
at være sikker...

Leif




Jonas Delfs (27-07-2011)
Kommentar
Fra : Jonas Delfs


Dato : 27-07-11 07:08

On Jul 27, 9:42 am, "Leif Neland" <l...@neland.dk> wrote:
> >"Jonas Delfs" <jonasde...@gmail.com> skrev i en meddelelse
> >news:2dd22259-52d9-45f4-a81c-554c2e75d7ac@o18g2000yqm.googlegroups.com....
> >Jeg er i gang med at fiske data ud af denne html-tabel:
> >http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm
>
> Nu husker du lige:
>
> "Selve pollendata inklusive historiske data er ophavsretligt beskyttet og
> privatpersoners, virksomheders, organisationers o.a. brug af data fx til
> kommercielt brug i informations- eller salgsøjemed må kun ske efter
> forudgående skriftlig aftale med Astma-Allergi Danmark  og Danmarks
> Meteorologiske Institut."

Begge parter er med i projektet. :)

Tak for svar til jer andre - antallet af kolonner er ikke mere
dynamisk end at det varierer med 2 pt. Jeg har derfor bare skrevet mit
pattern ud, og undgået de nestede patterns.
Mit spørgsmål var blot i håb om at der var en mere elegant løsning.

Mvh. Jonas

Chano Andersen (27-07-2011)
Kommentar
Fra : Chano Andersen


Dato : 27-07-11 18:59

Den 27-07-2011 15:07, Jonas Delfs skrev:
> On Jul 27, 9:42 am, "Leif Neland"<l...@neland.dk> wrote:
>>> "Jonas Delfs"<jonasde...@gmail.com> skrev i en meddelelse
>>> news:2dd22259-52d9-45f4-a81c-554c2e75d7ac@o18g2000yqm.googlegroups.com....
>>> Jeg er i gang med at fiske data ud af denne html-tabel:
>>> http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm
>>
>> Nu husker du lige:
>>
>> "Selve pollendata inklusive historiske data er ophavsretligt beskyttet og
>> privatpersoners, virksomheders, organisationers o.a. brug af data fx til
>> kommercielt brug i informations- eller salgsøjemed må kun ske efter
>> forudgående skriftlig aftale med Astma-Allergi Danmark og Danmarks
>> Meteorologiske Institut."
>
> Begge parter er med i projektet. :)
>

Hvis de er det, så burde det vel være muligt at finde en anden løsning i
forhold til at få fat i dataene?

- Chano Andersen

Martin Larsen (27-07-2011)
Kommentar
Fra : Martin Larsen


Dato : 27-07-11 20:45

Jonas Delfs wrote:

> Det virker upåklageligt. Men da antallet af data-kolonner kan variere,
> skal mit pattern også være dynamisk.

Antallet af kolonner ser da ud til at være konstant. Eller misforstår
jeg hvad du mener?

Martin Larsen (27-07-2011)
Kommentar
Fra : Martin Larsen


Dato : 27-07-11 21:00

Martin Larsen wrote:

>> Det virker upåklageligt. Men da antallet af data-kolonner kan variere,
>> skal mit pattern også være dynamisk.
>
> Antallet af kolonner ser da ud til at være konstant. Eller misforstår
> jeg hvad du mener?

Og vil du kun have tallet for el hevet ud?

Christian Hansen (29-07-2011)
Kommentar
Fra : Christian Hansen


Dato : 29-07-11 13:45

On 07/26/2011 03:11 PM, Jonas Delfs wrote:
> Hej -
>
> Jeg er i gang med at fiske data ud af denne html-tabel:
> http://www.dmi.dk/dmi/index/viden/pollen/pollen-tabel-2011-dmi.htm

Hej Jonas

Jeg ville benytte DOMDocument til at trække informationerne ud med, da
der er tale om et html-dokument. Det er derfor en god og robust løsning
- og nem at læse og arbejde videre med. Jeg har lavet dig et eksempel her:

http://www.resource-it.dk/tmp/dmi.php

Læs om PHP's DOMDocument her : http://cz.php.net/manual/en/book.dom.php

Koden kan ses allernederst efter selve dumpet af det array, jeg putter
informationerne ind i.

Du kan formatere array-et som du vil - jeg har blot lavet et sorteret på
dato.

Bemærk at jeg i dovenskab ikke har gidet håndtere utf8 vs iso8895-1 -
det kan du selv få lov til :)

Venligst


--
Christian Hansen
http://www.resource-it.dk/

Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste