Toon posts:

[PHP] Regex herhaling in string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het probleem is als volgt:

Je hebt een string waar meerdere keren verschillende informatie in staat maar wel in dezelfde vorm. Nu krijg ik wel 2 strings terug maar hij doet het maar 1 keer dus de ene string is goed en de andere moet nog verder worden gesplitst.

Hoe krijg ik dit voor elkaar met een preg_match_all?

Zover ben ik nu: /^<b> Titel: <\/b> (.*) <br> <b> Auteur: <\/b> (.*) <br> (Uitgeverij:|Uitgave:)(.*) <br> ISBN (.*) <br> Paginas: (.*) <br> (Prijs: |Prijs: |Prijs: )([0-9]+,+)\.(.*)$/

Daarbij ben ik hier nog geen wonder in maar na goed zoeken en proberen vraag ik het toch maar...

Iets als dit moet dan in 3en gesplitst kunnen worden
Titel: De complete Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2002
ISBN 90 4390 250 0
Pagina\'s 440
Prijs: 27,50

Titel: De Stille Kracht van de Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2001
ISBN 90 4390 186 5
Pagina\'s 217
Prijs: 22,50

Titel: De Stille Kracht van de Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2001
ISBN 90 4390 186 5
Pagina\'s 217
Prijs: 22,50

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

preg_match_all al geprobeerd? :)

Verwijderd

Topicstarter
Op woensdag 19 juni 2002 13:52 schreef ACM het volgende:
preg_match_all al geprobeerd? :)
Ja ik doe dit met preg_match_all. Maar ik krijg het steeds in 2 delen terug terwijl ik het liefts drie strings wil hebben in dit voorbeeld.
Hij moet het dus in drie blokken tekst opdelen en dat terug geven.

Maar ik krijg het niet voor elkaar.

Verwijderd

Op woensdag 19 juni 2002 13:48 schreef haltink het volgende:
Hoe krijg ik dit voor elkaar met een preg_match_all?
Op woensdag 19 juni 2002 13:52 schreef ACM het volgende:
preg_match_all al geprobeerd? :)
I guess so :)

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17

Skinny

DIRECT!

Volgens mij heb jij hetzelfde "probleem" als ik ook had...

zie : [topic=480051/1/30]

en ook daar was ACM behulpzaam (+1) :)

SIZE does matter.
"You're go at throttle up!"


Verwijderd

Volgens mij ga je de mist in met (.*), die is standaard dus greedy.

Volgens mij kun je in plaats daarvan beter iets als
code:
1
([^<]*)

voor nemen, aangezien de < toch niet zo gauw in een titel voorkomt.

[edit]
Grmbl, rotte smileys :P

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 19 juni 2002 13:55 schreef Nokia het volgende:
I guess so :)
Oeps, overheen gelezen :)

Wat is precies de data wat je terugkrijgt en wat is er niet goed aan?
Je krijgt van preg_match_all als het goed is een array van 3 entries terug (de volgorde bepaal je met de extra parameter).
Tenzij de matchende regexp niet helemaal perfect past.

Bekijk dan je regexp nog eens tov de entry die ie niet wist te grijpen.

Verwijderd

Topicstarter
Op woensdag 19 juni 2002 14:01 schreef ACM het volgende:

[..]

Oeps, overheen gelezen :)

Wat is precies de data wat je terugkrijgt en wat is er niet goed aan?
Je krijgt van preg_match_all als het goed is een array van 3 entries terug (de volgorde bepaal je met de extra parameter).
Tenzij de matchende regexp niet helemaal perfect past.

Bekijk dan je regexp nog eens tov de entry die ie niet wist te grijpen.
Dity krijg ik terug met deze regex : /^(.*)(; Titel|. Titel)(.*)$/
Maar de bedoeling is dus in drie stukken. Oftewel het kan verschillend zijn.

Titel: De complete Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2002
ISBN 90 4390 250 0
Pagina\'s 440
Prijs: 27,50 Titel: De Stille Kracht van de Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2001
ISBN 90 4390 186 5
Pagina\'s 217
Prijs: 22,50

: Aan tafel met Yvonne Keuls
Auteur: Yvonne Keuls
Uitgeverij: De Fontein, Baarn, 2000
ISBN 90 2611 668 3
Pagina\'s 200
Prijs: 14,98

Verwijderd

Topicstarter
Bij mij is nog steeds de vraag hoe ik nu dus een herhaling doe met preg_match_all. Wie helpt ik zoek probeer en kom geen stap verder....... Doe ik de /U fout misschien iets doms?

Er moeten dus 3 titels uitkomen. Maar een andere keer kan het zijn dat het er 2 zijn. Dus dat verschilt steeds. Dus moet er iets vaneen loop worden gebruikt maar hoe.

Ik heb nu het volgende gemaakt:

preg_match_all("/^<b> Titel: <\/b> (.*) (<br> <b> Auteur: <\/b> .*)$/U", $regs[1][0], $matches);

for ($i=0; $i< count($matches[0]); $i++) {
echo "matched: ".$matches[0][$i]."<p>";
echo "part 1: ".$matches[1][$i]."<p>";
echo "part 2: ".$matches[2][$i]."<p>";
echo "part 3: ".$matches[3][$i]."<p>";
}

Voorbeeld string is

Titel: De complete Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2002
ISBN 90 4390 250 0
Pagina\'s 440
Prijs: 27,50 Titel: De Stille Kracht van de Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2001
ISBN 90 4390 186 5
Pagina\'s 217
Prijs: 22,50 Titel: Aan tafel met Yvonne Keuls
Auteur: Yvonne Keuls
Uitgeverij: De Fontein, Baarn, 2000
ISBN 90 2611 668 3
Pagina\'s 200
Prijs: 14,98

Antwoord is

part 1: De complete Indonesische keuken

part 2:
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2002
ISBN 90 4390 250 0
Pagina\'s 440
Prijs: 27,50 Titel: De Stille Kracht van de Indonesische keuken
Auteur: Lonny Gerungan
Uitgeverij: Tirion, Baarn, 2001
ISBN 90 4390 186 5
Pagina\'s 217
Prijs: 22,50 Titel: Aan tafel met Yvonne Keuls
Auteur: Yvonne Keuls
Uitgeverij: De Fontein, Baarn, 2000
ISBN 90 2611 668 3
Pagina\'s 200
Prijs: 14,98

part 3:

Verwijderd

Ik zal mijn post nog eens dunnetjes herhalen.
code:
1
(.*)

Dit stukje is veel te greedy, het pakt alles wat het maar kan, en laat dan telkens iets meer los aan het eind van de string als de string niet matchet. Net zolang tot dat wel gebeurt, en dat is zodra de laatste 'record' ongeveer matchet. Maar de eerste .* zal dus zo'n beetje de complete rest van de tekst hebben gegrepen.

Maak dus die .* minder greedy, bijvoorbeeld .*? of pas dat stukje zo aan dat hij niet alles kan matches, maar alleen een string die bepaalde karakters niet bevat. Uit jouw voorbeeld maak ik op dat het gaat om een stukje html, en dus zal de string moeten ophouden net voor de eerstvolgende tag, vandaar dus [^<]*
Pagina: 1