[PHP/RegEx] Herkennen van groepen en zijn items

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Na veel zoeken, lezen en 2 dagen non-stop proberen hoop ik dat jullie mij kunnen helpen.

We hebben de volgende data:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Agenda 1 Juni 2007

Activiteit 1
Op Lokatie X

Activiteit 2
Op Lokatie Y

Activiteit 3
Op Lokatie Z

Agenda 2 Juni 2007

Activiteit 4
Op Lokatie Q

Activiteit 5
Op Lokatie R

Agenda 3 Juni 2007

Activiteit 6
Op Lokatie Q

Activiteit 7
Op Lokatie R


Gewenste resultaat:
code:
1
2
3
4
5
6
7
1 Juni - X - Activiteit 1
1 Juni - Y - Activiteit 2
1 Juni - Z - Activiteit 3
2 Juni - Q - Activiteit 4
2 Juni - R - Activiteit 5
3 Juni - Q - Activiteit 6
3 Juni - R - Activiteit 7


Ik heb veel geprobeerd met preg_match_all en krijg het alleen voor elkaar om de activiteiten te herkennen en om te zetten naar de goede volgorde.

Wat mij niet lukt is het eerst herkennen van het Datum blok en vervolgens daarin de losse items weer herkennen. En tot slot dan de datum van dat blok voor de items te zetten.

Heeft iemand een idee?

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom wil je hier een regex voor gebruiken? Die input is perfect gewoon te analyseren door 'm regel voor regel in te lezen.

"Agenda"? Datum variabele zetten.
"Activiteit"? Activiteit var zetten.
"Op Locatie"? Locatie var zetten en die 3 variabelen afdrukken.

Simpel toch?

Acties:
  • 0 Henk 'm!

  • mace
  • Registratie: Juni 2003
  • Laatst online: 20-09 15:25

mace

Sapere Aude

gewoon matchen op agenda, en dan een array maken.
In AWK flans je dat zo in elkaar.
In PHP weet ik het zo niet, maar ik ben lui en gebruik dan CGI. :P

[ Voor 28% gewijzigd door mace op 01-08-2007 21:40 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het voorbeeld dat ik gegeven heb is simpeler dan de realiteit. Hierbij de 'complexe versie' :)

Dit is de orginele data:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Agenda op zaterdag 4 augustus 2007

<a href="http://inter/info?id=1" target="_blank">Activiteit</a>
Filiaal X
Den Haag
NL


<a href="http://inter/info?id=2" target="_blank">Activiteit</a>
Filiaal X
Amsterdam
NL


<a href="http://inter/info?id=3" target="_blank">Activiteit</a>
Filiaal X
Den Haag
NL

Agenda op Maandag 5 augustus 2007

<a href="http://inter/info?id=4" target="_blank">Activiteit</a>
Filiaal X
Den Haag
NL


<a href="http://inter/info?id=5" target="_blank">Activiteit</a>
Filiaal X
Den Haag
NL


<a href="http://inter/info?id=6" target="_blank">Activiteit</a>
Filiaal X
Den Haag
NL


Om de losse items te matchen en goed te zetten gebruik ik nu:
code:
1
2
3
4
5
6
preg_match_all('((\<a href=.*info.*"\>)(.*)(\</a\>)\r\n(\w+.*)\r\n(\w+.*)\r\n(\w+.*))im', $agenda, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {
    echo $val[5] . " - " . $val[2] . " - " . $val[4]. "\n";
    echo $val[1] . "Popup" . $val[3]. "\n\n";
}

Hierbij krijg ik een output waarbij de items helemaal kloppen, op het missen van de datum na.

code:
1
2
Amsterdam - Activiteit - Filiaal X
<a href="http://inter/info?id=6" target="_blank">Popup</a>


Welke code moet ik toevoegen om dit wel te krijgen? (heb veel geprobeerd maar een datum verschijnt er maar niet :))

code:
1
2
5 Augustus - Amsterdam - Activiteit - Filiaal X
<a href="http://inter/info?id=6" target="_blank">Popup</a>

[ Voor 15% gewijzigd door Verwijderd op 01-08-2007 22:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Principe blijft gelijk. De bron blijft nog steeds prima te parsen door 'm regel voor regel in te lezen.
Datum wissels herken je aan de "Agenda voor..." regels, een nieuwe activiteit herken je aan die "<a href...>..." regel, en daarna zijn de volgende 3 regels locatie, stad en landcode.

Ik zou hier niet gaan knoeien met onleesbare regexen, maar het gewoon zelf parsen.

De reden waarom je de datum niet tevoorschijn kan toveren heeft denk ik 2 oorzaken:
- die datumregel staat boven je "<a href..." check in je regex, en
- de datum wordt niet bij iedere activiteit herhaald.

Acties:
  • 0 Henk 'm!

Verwijderd

Pseudo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
$agenda_content = file('data.txt');

foreach ($agenda_content as $agenda_line){
    
    if (preg_match('#Agenda op (.*)#Ui', $agenda_line, $match)){
        $last_know_date = $match[1];
    }
    
}
?>


Een principe als dit?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 02 augustus 2007 @ 00:32:
Pseudo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
$agenda_content = file('data.txt');

foreach ($agenda_content as $agenda_line){
    
    if (preg_match('#Agenda op (.*)#Ui', $agenda_line, $match)){
        $last_know_date = $match[1];
    }
    
}
?>


Een principe als dit?
Geniaal! Ik heb het geprobeerd en werkt super.

Dank voor jullie hulp! :D
Pagina: 1