Archief - PHP: REGEXP: URLs uit file halen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

JohnBeton

Legacy Member
Hi,

ik heb een aantal (html) teksten waaruit ik automatisch de URLs (<a ... href="..." ...>...</a>) wil halen. (geen zoveelste vB code vraag dus ;))


Tot nu to gebruikte ik 2 regexps:
PHP:
$result=preg_match_all('#(<a(.*)href=("|\')(.*)("|\')(.*)>(.*)</a>)#Ui', $contents,$matches);
$matches werd dat terug ge-de-arrayed ;), en door deze regexp gehaald:
PHP:
$result=preg_match_all('#(<a href=("|\')(.*)((\.html|\.php|\.htm)(.*)|(\?)(.*)|(/))("|\')#Ui',$contents,$matches);

Deze combo werkt in 99% van de gevallen. Enkel wannneer de link een aanklikbare image is, lijken er problemen te zijn. Anyway, alles voor efficientie, dus probeerde ik bovenstaande te combineren in 1 regexp:

PHP:
$result=preg_match_all('#(<a(.*)href=("|\')(.*)((\.html|\.php|\.htm)(.*)|(\?)(.*)|(/))("|\')(.*)>(.*)</a>)#Ui',$contents,$matches);

Resultaat:
Code:
f="http://www.pixmania.nl/nl/nl/112186/art/canon/mvx35i.html">MVX35i</a
Verre van goed dus... Nu is mijn vraag:
kan iemand me assisteren bij het opstellen van een 100% waterproof regexp om mijn doel te bekomen??

Alvast bedankt!

maatje

Legacy Member
maar je kan ook simpelweg in array steken

<a href="http://www.pixmania.nl/". $array[..] ." ">blabla</a>

JohnBeton

Legacy Member
Handig programma idd! Thanks!
Anyway, heb nu 1 klein foutje weggehaald.. Maar zit nog met het probleem dat hij eigenlijk alles vanaf <a tot </a> teruggeeft.. Hoe kan ik er op de beste manier voor zorgen dat enkel hetgeen tussen ".." staat (na href=) wordt teruggegeven?

JohnBeton

Legacy Member
Heb ondertussen dit samengesteld:
Code:
$result=preg_match_all('#(href=("|\')(.*)((\.html|\.php|\.htm)(.*)|(\?)(.*)|(/))("|\'))#i',$contents,$matches);

Uitleg:
- moet beginnen met href=
- tekst na href= is omsloten door ".." of '..'
- tekst binnen die "" of '' kan alles bevatten en eindigt op 1 deze zaken
* .html, .php of .htm
* ? (gevolgd door parameters)
* / (bvb: www.telenet.be/ )

Het geheel is case-insensitive.


Toch zit ik nog met een probleem... In 99% van de gevallen werkt dit alles prima, maar neem nu volgend stuk tekst:
Code:
<td width="1" class="scheidingslijn_donker"></td>
<td align="center" class="achtergrond_gepostdoor" nowrap="nowrap">Categorie: <a href="http://www.murgfeesje.be/forum/i_tekst.php">Tekst</a> || Reacties: 1 || Bekeken: 97 || <a href="./viewtopic.php?t=264&amp;sid=f2fbac5749d0e6f895649317c6c39408">Meer lezen</a></td>
<td width="1" class="scheidingslijn_donker"></td>
Daar neemt hij dus het volgende uit:
Code:
http://www.murgfeesje.be/forum/i_tekst.php">Tekst</a> || Reacties: 1 || Bekeken: 97 || <a href="./viewtopic.php?t=264

I don't get it...

killgore

Legacy Member
Je moet hem ungreedy maken, vergeet die ? en doe gewoon dit :p:
$result=preg_match_all('#(href=("|\')(.*)((\.html|\.php|\.htm)(.*)|(\?)(.*)|(/))("|\'))#iU',$contents,$matches);

kzou ook een pak minder haakjes gebruiken zodat uw matches array minder groot wordt:
preg_match_all('#href=["|\'].*([\.html|\.php|\.htm].*|\?.*|/)["|\']#iU',$contents,$matches);
Als dat je bedoeling is natuurlijk ;).

killgore

Legacy Member
neemt hij dat ook op met je full-haakjes versie, moest je die "aangepaste" gebruikt hebben?

Want ik had nogal men twijfels bij het verwisselen van () met [] voor die | operator :s.

servi

Legacy Member
Je kan eventueel gebruiken :

href=(["']?)(.*?(\.html?|\.php).*?)(\1)[ >]

met als modifier case insensitive

de url zit dan in \2

deze werkt op volgende URLS correct :
<a id="blankenberge" href="http://www.voorbeeldje.be/site.php?=pagina/1545485>nextpage#d" target="_blank">testje</a>
<a href=voorbeeldje.html#pagina="test">Dit is een voorbeeldje</a>
<td width="1" class="scheidingslijn_donker"></td>
<td align="center" class="achtergrond_gepostdoor" nowrap="nowrap">Categorie: <a href="http://www.murgfeesje.be/forum/i_tekst.php">Tekst</a> || Reacties: 1 || Bekeken: 97 || <a href="./viewtopic.php?t=264&amp;sid=f2fbac5749d0e6f895649317c6c39408">Meer lezen</a></td>
<td width="1" class="scheidingslijn_donker"></td>
<a HRef=voorbeeldje.html?id=xasfdzef;>testje</a>
<a href='netje.css/controle?php=inderdaad'>Dit is mooi</a>

volgende detecteert hij niet correct : (denkt dat dit php is )
<a HREF=testje.css?id=265&amp;garantie=7&amp;zoeken=.php'>leuk hé</a>

JohnBeton

Legacy Member
neemt hij dat ook op met je full-haakjes versie, moest je die "aangepaste" gebruikt hebben?
Wel.... neen :)
But yet again: begrijp ook niet goed waarom...


@servi:
waar zit de link in deze lijn:
"<td width="1" class="scheidingslijn_donker"></td>" (uw 3de laatste goede regel)

En voor alle duidelijkheid (was niet 100% duidelijk in eerste post): ik wl enkel wat tussen de ".." staat van de href, en al de rest (<a, </a>, id="",...) heb ik niet nodig..

Oja: worden \2 e.d. niet enkel gebruikt bij substitutie??

servi

Legacy Member
ge kunt anders eens de reguliere expressie die ik gegeven heb proberen en zien wat dat geeft ...

JohnBeton

Legacy Member
servi zei:
ge kunt anders eens de reguliere expressie die ik gegeven heb proberen en zien wat dat geeft ...

Wel, hij mist de afbakening ["\']..


Nu haalde hij immers deze link op:=
"www.telenet.be/breedband/index.php?" accesskey="1">

JohnBeton

Legacy Member
Deze lijn werkt in 99,9% van de gevallen:
PHP:
$result=preg_match_all('#href=["|\'].*([\.html|\.php|\.htm].*|\?.*|/)["|\']#iU',$contents,$matches);

Toch is er 1 link waar hij problemen mee heeft, en ik zie niet goed in waarom.
De link is de volgende:
Code:
<a href="/biz" title="Economie">Economie (.BIZ)</a>
terwijl deze link dan weer geen problemen geeft:
Code:
<a href="/Kanaal/Index.aspx?kanaalid=101" title="Voetbal">Voetbal</a>

Wat het het verschil, buiten de lengte van de link??





Anyways, heb volgend stukje verwijderd, want uiteindelijk had het weinig nut:
PHP:
([\.html|\.php|\.htm].*|\?.*|/)[^/php]
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan