[PHP] Regex vraag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Ik heb een een regex waarmee ik alle regels waarin een plaatje dat een link is naar een jpg of een movie uit wil halen. De regex moet dus in grote lijnen dit doen:

1. zoek naar href of HREF
2. kijk of er voor de </a> een src staat (voor img src)

Nou heb ik de volgende regex:

"/([href|HREF][= = ])(.*?)(\.mpg|\.MPG|\.avi|\.AVI|\.mov|\.MOV|\.jpg|\.JPG|\.jpeg|\.JPEG)(.*?)[^\</a\>](.*?)(img|IMG)(.*?)(src[= = ])(.*?)(a>|A>)/i"

Ik neem ze even allemaal stap-voor-stap door zoals ik denk dat het werkt:

1. ([href|HREF][= = ]) match "href=" of "href =" (of in capitals)
2. (.*?) match anything
3. (\.mpg|\.MPG|\.avi|\.AVI|\.mov|\.MOV|\.jpg|\.JPG|\.jpeg|\.JPEG) match iets met die extensies
4. (.*?) match anything
5. [^\<\/a\>] match waar niet </a> in voorkomt, dus de href mag niet afgesloten worden voor de "src" is gematched
6. (.*?) match anything
7. (img|IMG) match img of IMG
8. (.*?) match anything
9. (src[= = ]) match src= of "src = "
10. (.*?) match anything
11. (a>|A>) match het einde van de href, dus /a> of /A>

Nou wilt het dus niet lukken. Als ik punt 5 en 6 weg haal krijg ik wel resultaten maar als ik die laat staan niet (de html code is wel goed)

Kan iemand me vertellen waarom put 5 (en 6) een probleem geeft? Wat doe ik hier verkeerd? Ik match toch daar waar niet "</a>" staat tussen punten 1-4 en 6-11?
Zelfs als ik punt 5 naar [^fasdfasfasd] verander krijg ik geen resultaten

[ Voor 13% gewijzigd door FireFoz op 30-03-2005 13:23 ]

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

met [^abc] match je alle chars behalve a, b en c, dus niet abc als geheel. In die lijn zal [^<\/a>] ook betekenen, match alle chars behalve <, /, a en >, dus niet </a> als geheel. Volgens mij zit daar je denkfout, dit doe je namelijk op meerdere plaatsen :)

<a href="blah">[img]"images/blah.JPG"></a[/img] zal dan ook niet matchen, want images/blah.jpg bevat zowel een / als een a.

([href|HREF][= = ]) betekent ook heel iets anders dan ((href|HREF) ?= ?).
Dit is wat je bedoelt neem ik aan. "((href of HREF) optionele spatie = optionele spatie)"

Als je trouwens case-insensitive matcht, kun je al die HREF|href en JPG|jpg ook weglaten, werkt beter (match ook jPg) en leest makkelijker.

[ Voor 65% gewijzigd door Gerco op 30-03-2005 13:34 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Dat zie ik dan inderdaad verkeerd :) Eens even veranderen dan en kijken of het dan beter gaat :)
Bedankt

-edit-

Ok ik heb er nu dit van gemaakt:

code:
1
/(href?=?)(.*?)(\.mpg|\.avi|\.mov|\.jpg|\.jpeg)(.*?)(^fasdfasdfasd)(.*?)(img)(.*?)(src?=?)(.*?)(a>)/i


Hij blijft nu echter nogsteeds hangen op

(.*?)(^fasdfasdfasd)(.*?)

Als ik dat weg haal doet ie het wel, maar dat moet er dus tussen (maar dan niet "fasdfasdfasd" maar "</a>", maar dit deed ik even om te testen, "fasdfasdfasd" staat er namelijk iig niet tussen dus zou ie moeten matchen. Zonder die doet het namelijk wel

-edit2-
Ok volgensmij moet het zoiets zijn:

(.*?!fasdfasdfasd.*?)

Maar dan nog iets anders :P

[ Voor 84% gewijzigd door FireFoz op 30-03-2005 14:09 ]

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 00:11
Misschien een beetje offtopic , maar wel een wellicht handige tip :)
Ik gebruik voor het maken van Regular Expressions het programma Regexbuddy

Op die manier kan je je regexpressions perfect testen (realtime) en exporteren naar alle bekende programeer talen :) ...

[ Voor 5% gewijzigd door om3ega op 31-03-2005 10:30 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Ik zou, om de regexp wat op te schonen, de controlle op de extensie eruit halen.
Ikzelf zou de extensies welke ik wil zoeken in een array zetten, alle sources ophalen met de regexp, en die dan met mn array vergelijken welke src-en ik wel en niet wil.
Daarnaast, zoals al genoemd, inderdaad case-instensitive werken. In php doe je dat met eregi() ipv ereg()

Acties:
  • 0 Henk 'm!

  • FireFoz
  • Registratie: Juni 2001
  • Laatst online: 18-06 08:40
Is het niet zo dat de regex case insensitive is als je "/i" achter de regex zet?

Leef lekker in het nu, er is niks anders


Acties:
  • 0 Henk 'm!

  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 04-09 12:38

DeMoN

Pastafari

FireFoz schreef op donderdag 31 maart 2005 @ 11:36:
Is het niet zo dat de regex case insensitive is als je "/i" achter de regex zet?
/regexp/i
is idd case insensitive :)

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

code:
1
~<a href=(['\"])(.*)([^/]+\.(png|jpg))\\1(?:.*)><img src=(['\"])(.*)\\5(?:.*)></a>~iU

Klaar voor een nieuwe uitdaging.

Pagina: 1