[REGEXP] externe CSS requests uit string.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Ik wil graag uit een string (een ajax response) de <link> tags opvangen die een extern stylesheet bestand ophalen.

Dus:
code:
1
<link rel="stylesheet" type="text/css" href="/css/geval.css">


So far so easy, hier heb ik voor:
code:
1
/<link.*rel="stylesheet".*href="([^"]*)">/


Maar nou bedacht ik me net, laat er nou net eens een wijsneus zijn die de rel="stylesheet" achter de href zet, dan gaat deze regexp niet werken.

Het komt er dus op neer dat de regexp zo moet zijn dat het niet uitmaakt of de rel="stylesheet" nou voor de href staat of er achter.

Is er nog een verstrooide tweaker wakker die mij een schop in de goede richting kan geven? :)

.


Acties:
  • 0 Henk 'm!

Verwijderd

Als je het mij vraagt kan je misschien beter alle attributen uitlezen, er zijn bijv nog wel meer link attributen, zoals media.

Cascading Stylesheet:
1
<link href="" rel="stylesheet" media="all"/>


Ik ben geen regex goeroe en het is niet getest, maar zoiets moet werken
code:
1
/<link( (.+)="(.*)")+>/

of wat meer zoals jij het hebt
code:
1
/<link(( rel="stylesheet")|( href="([^"]*)"))+>/

Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Ah ja ik snap je punt, en het zal idd beter werken om gewoon alle attributen uit te lezen.

Tnx voor de tip, ik dacht uiteindelijk veel te moeilijk =)

.


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Het zal vast niet onmogelijk zijn om met regex eruit te peuteren wat jij wilt, maar volgens mij is XPath hier meer voor geschikt. Heb je dat al eens overwogen?

Om alle betreffende link elements op te vragen zou je de volgende xpath-expressie kunnen gebruiken:
code:
1
//link[@rel='stylesheet']

Voordeel hiervan is dat je je niet druk hoeft te maken om waar de rel="stylesheet" staat, en dat je niet per ongeluk uitgecommente link-elementen tussen je resultaten krijgt.

Client-side XPath gebruiken doe je bijvoorbeeld zo.

Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Hmm maar dan zou ik het bestand 2 keer moeten ophalen. 1 keer op de css er uit te halen en daarna nog een keer omdat ik nog wat met de html moet doen.

Tenzij er nog een toString method is om de xml weer om te zetten naar html :P

Ojah en uitgecommte link elementen hoef ik me in dit geval niet druk om te maken, omdat die gegenereerd worden.

[ Voor 41% gewijzigd door Optix op 31-01-2009 15:26 ]

.


Acties:
  • 0 Henk 'm!

  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Zelfde insteek als Dominique. Gebruik deze opzet vaak om anchors binnen teksten op te zoeken en te vervangen, of voor het omzetten van forum-code naar html en vise-versa (dan met preg_replace_callback):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
define('PatternAttributes', '#([[:space:]]+)(?<name>.*?)=([\'"]?)(?<value>.*?)\\3(?=$|[[:space:]])#is');
define('lPattern', '#<link(?<attribs>.*?)/?>#is');

function isExternal($hrefValue)
{
    // controleer of external waarvan definitie onbekend
    return true;
}

function getAttributes($attribs)
{
    preg_match_all(PatternAttributes, $attribs, $attribMatches, PREG_SET_ORDER);
    foreach($attribMatches as $match)
        $attribTable[$match['name']] = $match['value'];

    return $attribTable;
}

function enumLinks($message)
{
    preg_match_all(lPattern, $message, $links, PREG_SET_ORDER);
    foreach($links as $link)
    {
        $attribTable = getAttributes($link['attribs']);
        $hrefValue = $attribTable['href'];
        if (isExternal($hrefValue))
            $result[] = $hrefValue;
    }

    return $result;
}

$msg = 
    '<html>
        <head>
            <link rel="stylesheet" type="text/css" href="/css/geval.css">
            <link href="/styles/nogeentje.css" rel="stylesheet" type="text/css" />
        </head>
        <body>
        </body>
    </html>';
    
print_r(enumLinks($msg));
?>

Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Misschien had ik even iets duidelijker kunnen zeggen dat het hier om javascript ging, maar dat leek irrelevant omdat het om een regexp gaat.

Anyhow, het hele regexp zootje begint me al wel wat te dagen maar de pattern die jij gebruikt om de attributen er uit te vissen is mij een grote alchebra. Hij werkt overigens ook niet...

.


Acties:
  • 0 Henk 'm!

Verwijderd

Optix schreef op zaterdag 31 januari 2009 @ 15:23:
Hmm maar dan zou ik het bestand 2 keer moeten ophalen. 1 keer op de css er uit te halen en daarna nog een keer omdat ik nog wat met de html moet doen.
Waarom zou je iets 2 keer moeten ophalen om er 2 keer iets mee te kunnen doen?
Tenzij er nog een toString method is om de xml weer om te zetten naar html :P
Je beschrijft het eigenlijke probleem niet. Je beschrijft alleen een deeloplossing waaruit blijkt dat je op het verkeerde spoor bent beland.
Ojah en uitgecommte link elementen hoef ik me in dit geval niet druk om te maken, omdat die gegenereerd worden.
Door?

Je vertelt maar een half verhaal. Dat is verdomd irritant. HTML moet je verwerken met een HTML parser, niet met reguliere expressies.

Acties:
  • 0 Henk 'm!

  • Optix
  • Registratie: Maart 2005
  • Laatst online: 12-08 19:46
Verwijderd schreef op zaterdag 31 januari 2009 @ 15:56:
[...]

Waarom zou je iets 2 keer moeten ophalen om er 2 keer iets mee te kunnen doen?

[...]

Je beschrijft het eigenlijke probleem niet. Je beschrijft alleen een deeloplossing waaruit blijkt dat je op het verkeerde spoor bent beland.

[...]

Door?

Je vertelt maar een half verhaal. Dat is verdomd irritant. HTML moet je verwerken met een HTML parser, niet met reguliere expressies.
Omdat, als ik er als xml door ga lopen, ik een xml object heb.
De html word daarna nog in een divje gepropt, dan heb ik dus niet zo veel aan een xml object.
Vandaar de opmerking of er ook een toString methode is.
Door?
Door PHP mocht je dat interesseren. Dat heb ik niet verteld omdat het niet relevant is...

.

Pagina: 1