[PHP -> RegExp] - Hoe haal je een HTML attribute uit een tag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Bij deze even een vraagje op een heel ander gebied. Een probleem waar op zich wel om heen valt te werken ... maar het kan makkelijker ...

Ik heb een html-pagina en daarvan wil ik graag met PHP achterhalen wat de gebruikte stylesheet is. Ergens in dat html-bestand zou dus een tag kunnen staan, die er ongeveer zo uit ziet:

code:
1
<link href='/inc/styles/main.css' rel='stylesheet' type='text/css'>


Wat ik dan graag wil terughebben is het: /inc/styles/main.css.

Nu weet ik, dat dit waarschijnlijk met RegExp moet worden opgelost, maar na ongeveer alle handleidingen en handboek erop te hebben nageslagen, is het me nog steeds niet gelukt om in alle gevallen de goede uitkomst te krijgen.

Iemand handig genoeg met Regular Expressions om hier een mooie oplossing voor te kunnen verzinnen?

Alvast grote dank!

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Matchen op iets dat tussen enkele of dubbele quotes staat en eindigt op .css . ? Wat heb je zelf al geprobeerd?

Sundown Circus


Acties:
  • 0 Henk 'm!

Verwijderd

Tip: Heb je de tweakers handleiding gelezen? Daar had ik zelf ook veel aan:

P&W FAQ - Regular expressions

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

RedRose schreef op 10 september 2004 @ 10:45:
Matchen op iets dat tussen enkele of dubbele quotes staat en eindigt op .css . ? Wat heb je zelf al geprobeerd?
daar heb je niks aan, stylesheets hoeven niet .css te hebben, kan net zo goed een php script zijn ;)

Maar gewoon matchen op dat stukje code
<link href=
ik ben dan niet zo'n held met regex'en maar zo moeilijk is dit niet ;)

overigens zou je die HTML ook als XML kunnen parsen :P

[ Voor 8% gewijzigd door Erkens op 10-09-2004 10:50 ]


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Nah Erkens, das waar. Ik zat meer te denken aan het ook nog scheiden van het eventuele pad en de filenaam. :)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

RedRose schreef op 10 september 2004 @ 10:50:
Nah Erkens, das waar. Ik zat meer te denken aan het ook nog scheiden van het eventuele pad en de filenaam. :)
Je moet ook op de volgorde van de attributen letten, die kunnen andersom staan ;)

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
code:
1
<link.+?href=(['"])([a-z0-9_/.-]+)\\1.*?/?>


En je php wordt dan:
PHP:
1
2
preg_match("|<link.+?href=(['\"])([a-z0-9_/.-]+)\\1.*?/?>|",$html,$matches);
$href = $matches[2];


edit:

Escapen,escapen.

[ Voor 132% gewijzigd door Skaah op 10-09-2004 11:01 ]


Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
code:
1
2
3
4
5
6
7
8
9
if ( preg_match("|<link.+?href=(['\"])([a-z0-9_-])+\\1.*?/?>|", $html, $matches) ) {
            
    echo "Match found!";
                
} else {
            
    echo "Not found!";
                
}


Helaas geeft-ie zo toch echt "Not found" terug...

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Yeah, ik had mijn post nog ff geüpdate. Kijk maar eens goed naar jou en mijn regexp.

Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Hoe is deze pattern dan opgebouwd?

<link.+?href=(['"])([a-z0-9_/.-]+)\\1.*?/?>


- <link -- het gezochte moet beginnen met <link
- .+? -- Na <link komt in ieder geval één willekeurig karakter (?: maar misschien ook niet?)
- href=["']) -- Daarna komt 'href=' gevolgd door ofwel een ", ofwel een '
- ([a-z0-9_/.-])+ -- Daarna komt in iedergeval één letter/cijfer uit de reeks a-z of 0-9, ofwel een underscore, een slash, een punt of een '-'
- \\1 -- Wat betekent dat?
- .* -- Daarna een willekeurig aantal willekeurige karakters.
- ?/? -- Daarna komt een slash (?)

Zoals jullie kunnen zien ... ik snap er vrij weinig van!

Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
@Skaah:

Nu werkt hij inderdaad wel ... je bent een KONING!

Helaas snap ik zelf nog steeds niet helemaal WAAROM het werkt.

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
gvanh schreef op 10 september 2004 @ 11:14:
Hoe is deze pattern dan opgebouwd?

<link.+?href=(['"])([a-z0-9_/.-]+)\\1.*?/?>


- <link -- het gezochte moet beginnen met <link
Klopt!
- .+? -- Na <link komt in ieder geval één willekeurig karakter (?: maar misschien ook niet?)
Oh ja, nu zie ik het ook, deze is een beetje raar. Het vraagteken kan wel weg.
Wacht, het vraagteken moet blijven want dat was voor ungreedy.
- href=(["']) -- Daarna komt 'href=' gevolgd door ofwel een ", ofwel een '
Je vergeet een haakje. Iets tussen haakjes () zetten betekent: bewaar voor later. Dit is de eerste keer dat ik iets bewaar, oftewel: nr 1.
- ([a-z0-9_/.-])+ -- Daarna komt in iedergeval één letter/cijfer uit de reeks a-z of 0-9, ofwel een underscore, een slash, een punt of een '-'
Dit zijn de tekens waaruit een (relatieve) url meestal is opgebouwd. Toevoegen naar eigen smaak.
- \\1 -- Wat betekent dat?
Gebruik nummer 1 nog een keer, dus als we zonet een " hadden, dan moet er nu weer een " staan, of als we een ' hadden, weer een '.
- .* -- Daarna een willekeurig aantal willekeurige karakters.
Eigenlijk: een willekeurig aantal karakters, of geen karakters.
- ?/? -- Daarna komt een slash (?)
Alweer een vraagteken teveel..., het was gisteravond laat en het is nu vroeg, zullen we maar zeggen.
/? betekent: er kan een / staan. Voor XHTML:
<link />
Zoals jullie kunnen zien ... ik snap er vrij weinig van!
Je hebt 'm toch bijna helemaal uitgelegd, hoor. _/-\o_

Hint, hint, zie sig!

[ Voor 12% gewijzigd door Skaah op 10-09-2004 15:15 ]


Acties:
  • 0 Henk 'm!

  • xander88
  • Registratie: September 2003
  • Laatst online: 28-02-2007
PHP:
1
2
3
4
5
6
preg_match(
  "[<link(.*)?href=['|\"|\s]?(.*?)['|\"|\s]]",
   "<link href='/inc/styles/main.css' rel='stylesheet' type='text/css'>", 
   $matches);

print_r($matches);

Werkt ook als er geen ' ' of " " gebruikt worden na href.

Acties:
  • 0 Henk 'm!

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
@skaah:

Dank voor de staps-gewijze uitleg ... dit is heel erg nuttig. Het begint nu inderdaad langzaam te dagen! De grote PHP bijbel die ik hier heb liggen, geeft wel redelijk uitgebreid uitleg over alle verschillende onderdelen, maar het geeft te weinig bruikbare voorbeelden, waarin één en ander wordt gecombineerd.

Ik heb weer een hoop geleerd vandaag, dank je wel!

Acties:
  • 0 Henk 'm!

Verwijderd

Je moet de tutorials op www.regularexpressions.info eens lezen als je echt veel wil leren over regular expressions.

[ Voor 4% gewijzigd door Verwijderd op 10-09-2004 13:30 ]


Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Wat doen de bovenstaande oplossingen als het href attribuut niet bestaat?
Ik ben geen absolute ster in het interpreteren van deze stijl reguliere expressies, maar op het moment is op het werk mn hoofdtaak omnimark scripts schrijven. Ik zet dus eigenlijk iedere paar regels code weer reguliere expressies in elkaar.

Zoals ik deze lees eten ze alle tekst op die volgt na een <link karakterreeks tot aan href=

Als ik gelijk heb eet de expressie dus lekker door tot bijvoorbeeld een <a href=
Als ik geen gelijk heb moet ik mijn perl-achtige reguliere expressie kennis even verfrissen...

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
RwD schreef op 10 september 2004 @ 13:54:
Wat doen de bovenstaande oplossingen als het href attribuut niet bestaat?
Dan wordt er niet gematched volgens mij.
Ik ben geen absolute ster in het interpreteren van deze stijl reguliere expressies, maar op het moment is op het werk mn hoofdtaak omnimark scripts schrijven. Ik zet dus eigenlijk iedere paar regels code weer reguliere expressies in elkaar.

Zoals ik deze lees eten ze alle tekst op die volgt na een <link karakterreeks tot aan href=
Er staat een vraagteken, dus in principe zou de expressie ungreedy moeten zijn. Ik heb het niet uitgebreidt getest, maar het kan eigenlijk niet misgaan omdat \\2 geen > mag bevatten en daardoor niet over meerdere tags kan matchen.
Als ik gelijk heb eet de expressie dus lekker door tot bijvoorbeeld een <a href=
Als ik geen gelijk heb moet ik mijn perl-achtige reguliere expressie kennis even verfrissen...
xander88 schreef op 10 september 2004 @ 11:54:
PHP:
1
2
3
4
5
6
preg_match(
  "[<link(.*)?href=['|\"|\s]?(.*?)['|\"|\s]]",
   "<link href='/inc/styles/main.css' rel='stylesheet' type='text/css'>", 
   $matches);

print_r($matches);

Werkt ook als er geen ' ' of " " gebruikt worden na href.
Dat is zo HTML 3.0.... :r Bovendien match je veel te greedy met die .*. Volgens jouw regexp mag dit: <link dit is het einde<a href="jab berish</a>' (Matched: jab)

[ Voor 27% gewijzigd door Skaah op 10-09-2004 15:19 ]


Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 10:05
En wat doet bovenstaande regexp met andere links? zoals:

HTML:
1
2
3
4
5
<LINK REL=Prev HREF="base.html" TITLE="BASE - Document Base URI">
<LINK REL=Next HREF="meta.html" TITLE="META - Metadata">
<LINK REL=Start HREF="../" TITLE="HTML 4.0 Reference">
<LINK REL=Copyright HREF="/copyright.html" TITLE="Copyright Notice">
<LINK REV=Made HREF="mailto:liam@htmlhelp.com" TITLE="HTML 4.0 Reference Feedback">



Zie ook: link

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

code:
1
<link.+?href=(['"])([a-z0-9_/.-]+)\\1.*?/?>

Dat daar een vraagteken na die plus mag voor ungreedy is nieuw voor me. maar dan nog als ie geen href vindt zou die door gaan lijkt me als ik het zo lees als er verder in het bestand wel een href staat.

Je kunt de expressie wel uitbreiden zodat ie nooit buiten de tag zal lopen en kijkt of href aanwezig is..

Maar goed, aangezien dat in ".+?" het vraagteken nieuw voor me is snap ik misschien niet waarom dat zo zal werken...
Pagina: 1