regex <a>...</a>
Ik probeer het volgende te zoeken in een string.
De info ophalen die op de plaats van de puntjes staat probeer ik op te halen. En het zou dan moeten werken op alle variante die kunnen. dus als er een class bij staat moet dat niets uit maken (<a class="link" href='...'>).
dit is wat ik heb bedacht:
Code (php)
1
2
3
4
5
2
3
4
5
$patroon = '/<[ \n\r]*a(?:.*?)href=[\'|\"]?(.*?)[\'|\"]?(?:.*?)>[ \n\r]*<[ \n\r]*img[ \n\r]*(?:.*?)src=[\'|\"]?(.*?)[\'|\"]?(?:.*?)>[ \n\r]*<[ \n\r]*/[ \n\r]*a[ \n\r]*>/i';
$part_one = '/<[ \n\r]*a(?:.*?)href=[\'|\"]?(.*?)[\'|\"]?(?:.*?)>/i'; # <a href='...'>
$part_two = '<[ \n\r]*img[ \n\r]*(?:.*?)src=[\'|\"]?(.*?)[\'|\"]?(?:.*?)>'; # <img scr='...'>
$part_three = '<[ \n\r]*/[ \n\r]*a[ \n\r]*>'; #</a>
$part_one = '/<[ \n\r]*a(?:.*?)href=[\'|\"]?(.*?)[\'|\"]?(?:.*?)>/i'; # <a href='...'>
$part_two = '<[ \n\r]*img[ \n\r]*(?:.*?)src=[\'|\"]?(.*?)[\'|\"]?(?:.*?)>'; # <img scr='...'>
$part_three = '<[ \n\r]*/[ \n\r]*a[ \n\r]*>'; #</a>
Ziet iemand waar ik fout ga?
http://gskinner.com/RegExr/
Succes, en dan net zolang prutsen totdat het lukt.
Anders zou ik 't maar via de DOM doen.
Succes, en dan net zolang prutsen totdat het lukt.
Anders zou ik 't maar via de DOM doen.
- [\'|\"] Dit betekent NIET ' of ", maar ' of | of " ! Maak hier dus gewoon [\'\"] van. Daarbij hoeft de dubbele quote niet gestript te worden, dus gewoon [\'"]
Ook matcht jouw code dit: <a href='url"><img src='url></a>
Dit wil je natuurlijk niet, dus kun je beter kijken naar een manier om te kijken naar het eerste teken en kijken wanneer deze stopt:
href=([\'"])(.*?)\1
Nu werkt enkel de url ZONDER enige quotes niet...
Hier moeten we nog voor compenseren: (href=([\'"])(.*?)\1|href=([^ ]+))
Daarbij vergeet je dat het ook toegestaan is om spaties e.d. tussen de href en het =-teken te zetten, ook kan dit tussen het =-teken en de waarden...
Ik denk dat je hiermee ver zult komen...
het moet in dit deel gebeuren. href=([\'"])(.*?)\1
Ik wil graag dat er gecontroleerd wordt of de href eindigt op .jpg, .gif, .png of iets dergelijks.
kan ik daar iets maken als \.(jpg|gif|png)+ dus dat zou dan href=([\'"])(.*?\.(jpg|gif|png)+)\1 zijn
Dit heb ik dan ook getest maar loop tegen het volgende probleem aan.
VB:
<a href="1.htm"><img src="1.jpg" width="400" height="300" border="0"></a>
Na href staat geen van 3 mogelijkheden het is namelijk htm. Dus hij zou deze moeten over slaan. Maar hij gaat gewoon opzoek naar een stuk dat wel matched en dus extract hij 03.htm"><img src="tm_03.jpg
Gewijzigd op 17/05/2011 18:05:53 door peter paul
Wat je hiertegen kunt doen ik kijken wat er absoluut niet in een url mag voorkomen. Ik denk nu als eerste aan quotes...
Je kunt namelijk vertellen wat er NIET in mag voorkomen: [^"]
Dan zou ik dit ervan maken: href=([\'"])([^\'"]+\.(?:jpg|gif|png))\1
Wat gebeurt hier?
eerst zoeken we op href=
Als we dit gevonden hebben pakken we de quote die erna staat ([\'"]) en slaan deze op als zijnde \1. Dan pakken we de tekst erna en zeggen dat daar geen quote in mag staan. Ik heb geprobeerd om de \1 te gebruiken, maar ik krijg [^\1] niet goed werkend, dus heb ik besloten dat er gewoon GEEN quote in mag... want dat zou je in principe alleen bij Javascript gebruiken, als ik het goed heb.
Daarna zoeken we op de extensie. Deze extensie hoeft niet als aparte variabele opgeslagen te worden: vandaar de ?: aan het begin van de group. En na de inhoud van het href-attribuut volgt de quote.
Als je het helemaal mooi/perfect wilt hebben, moet je denk ik de single en double quote apart matchen en ook nog controleren op eventueel gestripte quotes:
<a href="http://www.quote.nl/quote\".htm"><img src="1.jpg" width="400" height="300" border="0"></a>
Ik heb al gezegd dat er ook spaties/enters tussen de href en het =-teken kan zitten..
Daarbij wil ik ook melden dat een extensie niet alles zegt. Sommige afbeeldingen zijn .php; als ze gerendered worden via GD o.i.d. ... Daarbij kun je natuurlijk ook controleren of de inhoud van het href-attribuut gelijk is aan die van de src.
Code (php)
1
/<[ \n\r]*a(?:.*?)href[ \n\r]*=[ \n\r]*([\'"])([^\'"]+\.(?:jpg|gif|png|wmv|mpg))\1(?:.*?)>(?:.*?)<[ \n\r]*img[ \n\r]*(?:.*?)src[ \n\r]*=[ \n\r]*([\'"])(.*?)\1(?:.*?)>(?:.*?)<[ \n\r]*\/[ \n\r]*a[ \n\r]*>/is
Maar na veel testen ben ik iets tegen gekomen wat niet gaat zo als ik in gedachten had.
Rekent hij ook goed. Dus ik denk dat ik moet proberen er voor te zorgen dat in onderstaande combinatie </a> niet in dat deel mag voor komen
Maar het probleem is </a> kan op meerdere manieren geschreven worden met spaties en dergelijke. Hoe kan ik dit oplossen?
Gewijzigd op 19/05/2011 10:00:07 door peter paul