Toon posts:

Eregi proleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mede tweakers.

Ik zit met een eregi probleempje
ik heb de string
<td height="16" width="215"><font face="Verdana" size="2"><a href="test.html">TEST</a></font></td>
Nu wil ik alleen van de string de tekst "TEST" hebben en de url.
Maar dat lukt me niet, ik krijg helemeel geen tekst eruit.
De tekst TEST krijgen lukt me wel als geen <tags> meer achter staan. Maar allebij niet.
En de regels verschillen ook af en toe
bijv.
<td height="26" width="315"><font face="Verdana" size="2"><a href="test2.html">TEST2</a></font></td>

Weet iemand misschien hoe ik dit kan oplossen??

Alvast bedankt

ik gebruikte zelf iets van
$regel = eregi_replace ('<(.*)>', "", $regel);

  • tomato
  • Registratie: November 1999
  • Niet online
PHP:
1
2
3
4
5
6
<?
$pattern = '/<a[^>]+href="([^"]+)"[^>]*>([^<]+)</a>/i';
preg_match($pattern, $string, $matches);

echo $matches[1]." - ".$matches[2];
?>

Zoiets? Wanneer je je heel even verdiept in regexen is dit trouwens erg makkelijk ;)

  • tomato
  • Registratie: November 1999
  • Niet online
Of met XSL natuurlijk :)
code:
1
<xsl:template match="a">

Verwijderd

Topicstarter
Hoi

ik heb het geprobeerd, maar het werkte niet

Warning: Unknown modifier 'a'

dat zat in het stukje </a>, en als ik daar <\/a> van maak
is $matches[1] en 2 weer leeg.

Maar ik zel nog zelf ff kijken

toch bedankt !!

ps
waar kan ik goede informatie vinden over regexen, dat ik het straks ook zelf kan ??

Verwijderd

Topicstarter
Sorry

het werkt wel,
moest alleen zorgen dat ik alleen het stukje had van <a href....></a>

  • tomato
  • Registratie: November 1999
  • Niet online
Sorry, moest inderdaad even een \ voor, of andere delimiters gebruiken :o

Voor info over regexen, zoek op Google naar Regular Expressions (of zelfs naar Perl tutorials) en voor een overzichtje van de PCRE in PHP:

www.php.net/pcre

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
tomato: Of met XSL natuurlijk :)
:* . Inderdaad: als je stukjes uit een HTML file moet halen kan je het beste werken met XSLT of zelfs nog eenvoudiger: met XPath. Met XPath (wat dus gebruikt wordt in XSLT) kan je heel eenvoudig delen van een XML document aanwijzen.

Je kan dan veel eenvoudiger zulke zoekakties aangeven. Je bent een stuk minder met de syntax bezig (zoals bij reguliere expressies) en je hebt behoorlijk geavanceerde mogelijkheden voor het geven van voorwaarden.

Het zou erg goed zijn als deze technieken wat beter ingeburgerd raken :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Hartstikke bedankt !!!
ik denk dat ik er zo wel uit kan komen

en als de niet het geval is,
dan zien jullie mij weer verschijnen

bedankt

  • kroeske
  • Registratie: Mei 2000
  • Laatst online: 14-09 11:45
Op zondag 02 december 2001 22:16 schreef mbravenboer het volgende:

[..]

:* . Inderdaad: als je stukjes uit een HTML file moet halen kan je het beste werken met XSLT of zelfs nog eenvoudiger: met XPath. Met XPath (wat dus gebruikt wordt in XSLT) kan je heel eenvoudig delen van een XML document aanwijzen.

Je kan dan veel eenvoudiger zulke zoekakties aangeven. Je bent een stuk minder met de syntax bezig (zoals bij reguliere expressies) en je hebt behoorlijk geavanceerde mogelijkheden voor het geven van voorwaarden.

Het zou erg goed zijn als deze technieken wat beter ingeburgerd raken :) .
mbraveboer: de XSLT profeet :+

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

ik heb ongeveer hetzelfde probleem.... maar dan weer iets uitgebreider....

uit een nogal grote $string wil ik *alle* <a ...>TEKST</a> weghalen; maar TEKST moet wel blijven staan. M.a.w.: het mag geen link meer zijn...

(ik ken aardig php, maar dat ge-"$pattern = '/<a[^>]+href="([^"]+)"[^>]*>([^<]+)</a>/i';" snap ik dus geen zak van, en al helemaal niet rond dit uur... Ik heb in het php manual ook nergens goed kunnen vinden wat hier nou de syntax van is etc...)

You are the all-dancing, all-singing crap of the world - Jack


  • tomato
  • Registratie: November 1999
  • Niet online
Ok, komt ie, ook maar weer rekening houdend met geescapede quotes in attributes etc bla bla bla):
PHP:
1
2
3
4
5
6
<?
$p = '/<[aA](:?[[:space:]]+[^=]+="(:?[^"\\\\]*(:?\\\\.[^"\\\\]*)*)")*[[:space:]]*>([^<]*)</[aA]>/'
$r = "$1";

$s = preg_replace($p, $r, $s);
?>

Sorry voor de lange brij, ik had geen zin om het pattern te voorzien van comments en een /x modifier...

Ook niet getest, maar zoiets zou het moeten worden.

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

goed... heb 'm maar 's gewoon letterlijk gecopieerd...

geeft nu een : Warning: Unknown modifier '['

(nogmaals, zo'n pattern is voor mij nog 1 warboel..)

en die $1 daar? was die voor?

thanks in ieder geval!

You are the all-dancing, all-singing crap of the world - Jack


  • tomato
  • Registratie: November 1999
  • Niet online
Even kort antwoord op je probleem: zet een \ voor de / in </[aA]>

  • tomato
  • Registratie: November 1999
  • Niet online
Sorry, ik ben te duf vandaag :Z

Zo werkt ie:
PHP:
1
2
3
<?
$p = '/<[aA](?:[[:space:]]+[^=]+="(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)")*[[:space:]]*>([^<]*)<\/[aA]>/';
?>

Maar ik bedenk me nu wel dat ie niet werkt als er attributes waarvan de values niet gequote zijn of tussen enkele quotes staan voorkomen in de <a> tag...


Uiteraard is dit ook weer een voorbeeld wat je prachtig met XSL kunt doen :)

  • tomato
  • Registratie: November 1999
  • Niet online
BramT:zo'n pattern is voor mij nog 1 warboel..
Ik zal straks als ik er nog zin/tijd voor heb misschien even het pattern met comments neerzetten, misschien zelfs inclusief wat uitbreidingen waar ik het in mijn vorige post over had.
en die $1 daar? was die voor?
Die bevat na de match de gevangen tekst door de eerste haakjes (in jouw geval de tekst die je wilt houden).

  • tomato
  • Registratie: November 1999
  • Niet online
Ok, deze werkt echt (zelfs getest :+). Ik weet niet zeker of je in PHP de /x modifier kunt gebruiken (whitespaces worden genegeerd en je kunt comments opnemen achter #), anders moet je hem zelf maar weer even in elkaar plakken:
code:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/

   #########################################################
   #
   #   Pattern to match a link and capture its text
   #
   #   Quick Hack (tm) not by Arien but by tomato
   #
   #########################################################

   <[aA]                # Begin of opening 'a' tag

       (?:

       # Allow optional attributes in the 'a' tag

       [[:space:]]+      # Start with space

       # Different types of attributes,
       # open brackets for alternation

       (?:

        # Doublequoted attribute

        [^=]+=        # Attribute and the = sign
        \"          # Opening quote (escaped)

           [^\"\\\\]*    # Normal
           (?:
            \\\\.      # Special
            [^\"\\\\]*    # Normal
           )*

        \"          # Closing quote (escaped)

       |  # OR
        # Singlequoted attribute

        [^=]+=        # Attribute and the = sign
        '            # Opening quote

           [^'\\\\]*      # Normal
           (?:
            \\\\.      # Special
            [^'\\\\]*     # Normal
           )*

        '            # Closing quote

       |  # OR
        # non-quoted attribute

        [^[[:space:]>]+     # Anything but space or >

       )                # Close alternation

    # End of attribute, allow it zero or more times

    )*

    [[:space:]]*          # Optional spaces

   >                    # End of opening 'a tag

   # Here starts the text we want to match

   (
    [^<]*              # Anything till the next <
   )

   # End of text we want to match

   <\/[aA]>            # Closing 'a' tag

   #########################################################
   #
   #   End of pattern
   #
   #########################################################

/x

Sorry, per ongeluk in het Engels gedaan :P
Het enige wat ik me nog zou kunnen bedenken wanneer hij niet zou werken is wanneer er tags genest zijn in de <a> tags. Daar is eventueel nog wel iets aan te doen, maar dan wordt ie ongeveer 2x zo lang :)

Voor de goede orde:
Deze houdt rekening met PHP's string processing en bevat daarvoor de nodige escapes (ja leuk he, regexen in PHP |:(). Ik ga er trouwens vanuit dat je hem tussen " en " zet ipv wat ik tot nu toe deed (tussen ' en '), maar dat kun je zo aanpassen als je wilt (gewoon de andere soort in de regex escapen).

  • tomato
  • Registratie: November 1999
  • Niet online
Sorry, kon het niet laten, deze hier onder werkt ook met tags tussen de <a> tags (deze blijven behouden). Enige wat niet mag is <a> tags genest binnen je <a> tags, maar dat lijkt me ook heel onlogisch (ik vraag me af of het uberhaupt mag volgens de XHTML specificaties...). Verder dacht ik dat er geen attributes in closing tags mochten, daar ben ik dan ook van uitgegaan. Ik heb hem zelfs weer even getest ;)

Er is nog wel enige optimalisering mogelijk, maar hier hebben we hem (349 bytes :P):
code:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/

   #########################################################
   #
   #   Pattern to match a link and capture its text
   #
   #   Quick Hack (tm) not by Arien but by tomato
   #
   #########################################################

   <[aA]                # Begin of opening 'a' tag

    (?:

       # Allow optional attributes in the 'a' tag

       [[:space:]]+      # Start with space

       # Different types of attributes,
       # open brackets for alternation

       (?:

        # Doublequoted attribute

        [^=]+=        # Attribute and the = sign
        \"          # Opening quote (escaped)

           [^\"\\\\]*    # Normal
           (?:
            \\\\.      # Special
            [^\"\\\\]*    # Normal
           )*

        \"          # Closing quote (escaped)

       |  # OR
        # Singlequoted attribute

        [^=]+=        # Attribute and the = sign
        '            # Opening quote

           [^'\\\\]*      # Normal
           (?:
            \\\\.      # Special
            [^'\\\\]*     # Normal
           )*

        '            # Closing quote

       |  # OR
        # non-quoted attribute

        [^[[:space:]>]+     # Anything but space or >

       )                # Close alternation

       # End of attribute, allow it zero or more times

    )*

    [[:space:]]*          # Optional spaces

   >                    # End of opening 'a' tag

   # Here starts the text we want to match

   (

    [^<]*              # Anything till the next <

    # We want to allow optional tags nested inside
    # the 'a' tag. Anything is allowed, except for
    # another 'a' tag.

    (?:

       # Nested opening tag with optional attributes

       <                # Start of opening tag

        (?:
           [^aA[:space:]>]  # One char, not 'a', tag
        |
           [^[:space:]>]{2,}   # Two or more chars tag
        )

        (?:

           # Allow optional attributes in the tag

           [[:space:]]+     # Start with space

           # Different types of attributes,
           # open brackets for alternation

           (?:

             # Doublequoted attribute

            [^=]+=    # Attribute and the = sign
            \"      # Opening quote (escaped)

               # Another normal-special-normal pattern

               [^\"\\\\]*
               (?:
                \\\\.
                [^\"\\\\]*
               )*

            \"      # Closing quote (escaped)

           |  # OR
            # Singlequoted attribute

            [^=]+=    # Attribute and the = sign
            '        # Opening quote

               # Another normal-special-normal pattern

               [^'\\\\]*
               (?:
                \\\\.
                [^'\\\\]*
               )*

            '        # Closing quote

           |  # OR
            # non-quoted attribute

            [^[[:space:]>]+

           )            # Close alternation

           # End of attribute, allow zero or more

        )*

        [[:space:]]*      # Optional spaces

       >                # End of opening tag

    |  # OR
         # Nested closing tag

       <\/
        (?:
           [^aA>]        # One char, not 'a', tag
        |
           [^>]{2,}    # Two or more chars tag
        )
       >

    |  # OR
       # Other text after a nested tag

       [^<]*            # Optional 'other' text

       # End of nested tag or text, allow zero or more

    )*

   )

   # End of text we want to match

   <\/[aA]>            # Closing 'a' tag

   #########################################################
   #
   #   End of pattern
   #
   #########################################################

/x

Dit is hem gewoon achter elkaar (kunstmatige enters erin gezet voor layout van Topix):
code:
1
2
3
4
5
6
/<[aA](?:[[:space:]]+(?:[^=]+=\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*
\"|[^=]+='[^'\\\\]*(?:\\\\.[^'\\\\]*)*'|[^[[:space:]>]+))*[[:s
pace:]]*>([^<]*(?:<(?:[^aA[:space:]>]|[^[:space:]>]{2,})(?:[[:
space:]]+(?:[^=]+=\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|[^=]+='[^
'\\\\]*(?:\\\\.[^'\\\\]*)*'|[^[[:space:]>]+))*[[:space:]]*>|<\
/(?:[^aA>]|[^>]{2,})>|[^<]*)*)<\/[aA]>/

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Gaap :O wat is XPath toch makkelijk... ;) . Het is in feite toch krankzinnig dat dergelijke oplossingen nog steeds worden gebruikt....

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Even ter illustratie:
<td height="16" width="215"><font face="Verdana" size="2"><a href="test.html">TEST</a></font></td>

Nu wil ik alleen van de string de tekst "TEST" hebben en de url.
code:
1
//td//a/text()

of als het minder strict om de locatie gaat:
code:
1
//a/text()

als je de url wilt hebben:
code:
1
//td//a/@url
k heb ongeveer hetzelfde probleem.... maar dan weer iets uitgebreider....

uit een nogal grote $string wil ik *alle* <a ...>TEKST</a> weghalen; maar TEKST moet wel blijven staan. M.a.w.: het mag geen link meer zijn...
Dat is dus een transformatie. Met XSLT kan dat heel gemakkelijk:
code:
1
2
3
<xsl:template match="a">
     <xsl:value-of select="text()"/>
</xsl:template>

om even te illustreren hoe het werkt: stel dat je de ex-links vet wilt hebben:
code:
1
2
3
4
5
<xsl:template match="a">
     <b>
       <xsl:value-of select="text()"/>
     </b>
</xsl:template>

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • tomato
  • Registratie: November 1999
  • Niet online
mbravenboer: Gaap :O wat is XPath toch makkelijk... ;) . Het is in feite toch krankzinnig dat dergelijke oplossingen nog steeds worden gebruikt....
Ben ik helemaal met je eens, de voorbeeldjes die je geeft zijn natuurlijk ook uiterst gemakkelijk en generiek.

Dus als dit probleem exact hetzelfde blijft is er natuurlijk geen reden om geen XSL te gebruiken.
Maar er zijn nog steeds situaties waar dat natuurlijk niet gaat. Misschien is er geen XSL of zelfs geen XPath voorhanden in je omgeving. Of misschien verandert het probleem een beetje, denk bijvoorbeeld aan [ en ] in plaats van < en > wanneer je iets dergelijks met UBB opgemaakte tekst wilt doen ipv met HTML. Daar naast gok ik dat je deze regex een stuk sneller kunt krijgen dan een XSL oplossing.
Dan blijft zo'n regulier expressie nog steeds een tooltje waarmee je heel dicht bij de basis blijft en je niet vast zit aan de dingen die XPath juist zo generiek maken.

Maar ik geef je gelijk, voor precies dit probleem gebruik je natuurlijk makkelijk XSL (als dat mogelijk is).

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

jezus... okee... ik moet nog leren.. ;)

maar goed... ik wil dit dus even allemaal in functie zetten om het even overzichtelijk te houden:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
function riptext2($text)
{
    $p = "/<[aA](?:[[:space:]]+(?:[^=]+=\"[^\"\\\\]*
        (?:\\\\.[^\"\\\\]*)*\"|[^=]+='[^'\\\\]*(?:\\\\.
        [^'\\\\]*)*'|[^[[:space:]>]+))*[[:space:]]*>([^<]*
        (?:<(?:[^aA[:space:]>]|[^[:space:]>]{2,})(?:
        [[:space:]]+(?:[^=]+=\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)
        *\"|[^=]+='[^'\\\\]*(?:\\\\.[^'\\\\]*)*'|[^
        [[:space:]>]+))*[[:space:]]*>|<\/(?:[^aA>]|[^>]{2,})
        >|[^<]*)*)<\/[aA]>/";
    $r = "$1";
    $finaldata = preg_replace($p, $r, $text);
    return $finaldata;
}
?>

(ook even returtjes toegevoegd voor de mooie layout...)

het resultaat ($correctstring) moet dus na een aanroep als:
PHP:
1
2
3
<?
$correctstring = riptext2($stringmetlinks);
?>

een HTML string zijn ZONDER links...

nieuw probleem: het uitvoeren hiervan geeft een Fatal error: Maximum execution time of 30 seconds exceeded error.... zit dus iets niet helemaal goed.. |:(

suggesties?

en nogmaals bedankt voor de tijd.. zal 's kijken of ik andere mensen kan gaan helpen hier.. ;)

You are the all-dancing, all-singing crap of the world - Jack


  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

iemand?!?!?

we zijn zooooo close... ;)

ik kan me af en toe helemaal vastbijten in die shit.. en ik wil dalijk niet te laat bij m'n vriendin zijn om te eten... ;)

You are the all-dancing, all-singing crap of the world - Jack


  • tomato
  • Registratie: November 1999
  • Niet online
Je hebt gelijk, er zit ergens een flinke performance bottleneck. Ik heb hem dan ook nog niet geoptimaliseerd, ik vermoed dat er nog wat aardige truckjes uit te halen zijn.

Bij mij gaat hij binnen de seconde tot ongeveer 750 karakters (de input string dus), met grotere strings gaat hij al heel snel over de 30 seconden heen...

Als ik er vanavond nog zin in heb zal ik nog wel even kijken of ik er wat leuks mee kan doen.

Maar voor nu, waar gebruik je de XSL oplossing niet?
code:
1
2
3
4
5
<xsl:template match="a">
     <b>
       <xsl:value-of select="text()"/>
     </b>
</xsl:template>

Wel zo makkelijk in jouw situatie lijkt me.

  • tomato
  • Registratie: November 1999
  • Niet online
BramT: iemand?!?!?
Geduld is een schone zaak he ;)
ik kan me af en toe helemaal vastbijten in die shit.. en ik wil dalijk niet te laat bij m'n vriendin zijn om te eten... ;)
Ga even lekker eten met je vriendin zou ik zeggen :)

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

ahaaa... tsjah... de string die ik gebruik loopt tegen de 30 - 40 kb aan... :P

dat XSL gedoe... kan ik dat gewoon in m'n PHP zetten?!?!?!? (bram heeft nog nooit van XSL gehoord.... bram wordt oud... :P)

maar goed...

bedankt ik in ieder geval maar weer... ik ga m'n vriendin een ku..... ik ga eten.. ;)

groeten!

edit:
en bram kan niet meer spellen...:(

You are the all-dancing, all-singing crap of the world - Jack


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Mja, misschien heb je nog wat aan strip_tags() ?
Als je alleen de tekst die bij tags hoort wil hebben, werkt dat prima ;)

Verwijderd

Ik heb even de link in mbravenboer's sig gevolgd, en vond meteen een reden om XPath niet te gebruiken (en misschien waarom het zo weinig gebruikt word): de specificatie is 40 (!) pagina's lang (in mijn browser). Reguliere expressie grammatica kun je in vijf pagina's tot in de puntjes uitleggen.

Edit: En met reguliere expressies kun je ook nog eens heel wat meer dan in xml/html achtige documentjes rondkijken.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 03 december 2001 18:24 schreef Sneech het volgende:
Ik heb even de link in mbravenboer's sig gevolgd, en vond meteen een reden om XPath niet te gebruiken (en misschien waarom het zo weinig gebruikt word): de specificatie is 40 (!) pagina's lang (in mijn browser). Reguliere expressie grammatica kun je in vijf pagina's tot in de puntjes uitleggen.

Edit: En met reguliere expressies kun je ook nog eens heel wat meer dan in xml/html achtige documentjes rondkijken.
Tja de specificatie van XHTML is nog vele malen langer, en dat wordt ook uitgebreid toegepast. Die documenten van het W3C zijn altijd erg officieel dwz uitgebreid. Ik vind het een beetje raar argument om te zeggen dat je iets niet gaat gebruiken omdat het uitgebreid gedocumenteerd is.
Tuurlijk zijn RE erg handig, bv bij validatie van e-mail adressen, postcodes, e.d., dit kan XPath allemaal niet. Maar het is ook voor een ander doel bedoeld, het makkelijk benaderen van elementen in een XML structuur. En als iedereen nou zijn data opslaat/aanbied in XML dan zal het zeker weten meer gebruikt gaan worden.

  • tomato
  • Registratie: November 1999
  • Niet online
Sneech: Ik heb even de link in mbravenboer's sig gevolgd, en vond meteen een reden om XPath niet te gebruiken (en misschien waarom het zo weinig gebruikt word): de specificatie is 40 (!) pagina's lang (in mijn browser).
Het is inderdaad vrij veel, maar het zijn dan ook de gedetaileerde specificaties. Deze zijn erg droog en zonder veel voorbeelden, als je je wilt verdiepen in XPath of XSL zou ik niet daar beginnen, maar bij een tutorial. Dan kom je snel al erg ver.
Reguliere expressie grammatica kun je in vijf pagina's tot in de puntjes uitleggen.
Voorbeeld? Ik zie nog niet zo snel iemand dat doen eigenlijk. Er bestaan trouwens ook helemaal geen specificaties van de reguliere expressie grammatica, er is geen standaard voor. Je zou hooguit de regexen van een bepaalde tool kunnen bekijken (een bepaalde regex 'flavor' dus). Soms zijn er niet eens docs van, soms zijn ze veel te oppervlakkig en soms zijn ze volledig (maar dan beslaan ze ook vele pagina's).

Het uitleggen van regex grammatica is vrij snel mogelijk (afhankelijk van hoever je wilt gaan), maar dat is ook het geval bij XPath/XSL. Wanneer je diep op regexen in wilt gaan kun je er ook zo lang over schrijven als je wilt (beetje cliche, maar Friedl krijgt toch 300 pagina's vol over inmiddels verouderde en versimpelde regexen).
Edit: En met reguliere expressies kun je ook nog eens heel wat meer dan in xml/html achtige documentjes rondkijken.
Het is ook gewoon iets heel anders. Er zijn ook dingen die je niet met regexen kunt doen en wel met XSL.

Verwijderd

Ik heb het hier natuurlijk over het probleem van de topicstarter. Voor iets simpels als wat data uit html extracten heb ik geen zin om iets ingewikkelds te gaan leren gebruiken, wat ook nog eens in verband staat met allerlei andere technologien die ik op het moment helemaal niet nodig heb.
Ik geloof best dat XPath leuk is voor allerlei zaken, maar een situatie als dit zou voor mij geen aanleiding zijn XPath en aanverwante technologien te gaan bestuderen.

Mijn opmerking dat je met reguliere expressies meer kan, neem ik even terug. Beide technologien hebben eigenlijk een totaal verschillend doel, en dat voor dit probleem toevallig beide een oplossing kunnen bieden is toeval.

  • BramT
  • Registratie: Oktober 2001
  • Laatst online: 20:32

BramT

Rule #1

jezus...

dit meen je niet


strip_tags()



* bram valt even van z'n stoel..... waarom heeft niemand dit eerder verteld?!? ;)


maar goed... ik moet later nog iets hebben die wel de url er uit kan halen... maar zal ik maar een nieuwe topic voor maken...

bedankt!!!

You are the all-dancing, all-singing crap of the world - Jack


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
De XPath specificatie is natuurlijk ook absoluut niet het beste startpunt om XPath te gaan leren. Je gaat ook geen Java leren door de language specification door te gaan lezen. Dergelijke standaarden bevatten voor een beginner veel te veel details en zijn eigenlijk alleen interessant voor implementators.

XPath is in zijn simpelste vorm uitermate eenvoudig. XPath geeft gewoon paden aan in een XML structuur. Je kunt op veel sites eenvoudige handleidingen vinden. Met name de handleiding op http://www.zvon.org zijn erg goed.
Een XPath is gewoon een lange regel, waarin je het path op geeft. Dit heeft heel veel overeenkomsten met directory structuren.

Een paar voorbeelden:
code:
1
/html/body/h1

De / vooraan betekent dat je vanaf de wortel van de XML structuur werkt. In dit path geef je aan dat je alle elementen wilt selecteren die:

1. 'h1' heten
2. Als parent een 'body' hebben
3. de 'body' tag moet weer in 'html' zitten
4. 'html' moet weer in de root staan.

Je geeft op deze manier dus paden door een XML structuur aan: vanaf de root volgt je eerst html, dan body en dan h1. Simpel toch? :) .
code:
1
//a

// betekent dat er een willekeurig pad van tags mag voorkomen. Dit XPath selecteer dus alle a elementen op wat voor diepte in de boom dan ook.
code:
1
//td/a

Dit XPath selecteert alle a tags die als parent een td hebben. de td mag op elke diepte voorkomen.
code:
1
//td/a/@href

De @ geeft aan dat je een attribuut bedoelt. Dit XPath selecteer dus de href attributen in een a, die als parent weer een td heeft.

Dit:
code:
1
//td/a

selecteert de knoop 'a'. Hierin zitten dus ook de attributen en dergelijke. Stel je dat je tekst in a wilt hebben dan geeft je gewoon dit op:
code:
1
//td/a/text()

Het kan dus allemaal veel eenvoudiger worden gebruikt dan de specificatie doet vermoeden. Pak gewoon een leuke tutorial en kijk die eens door :) . Specificaties zijn er niet om voor de lol door te nemen ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
<Over het nut van reguliere expressies als er XPath is>

XPath is zo eenvoudig omdat het uit gaat van een standaard: XML. Omdat we het over een standaard hebben hoef je je niet meer met allemaal irrelevante details bezig te houden. Je werkt dus op het model van de xml-file, niet op de syntax van xml-file. Dit heeft grote voordelen omdat de code een stuk duidelijker is.

Reguliere expresssies blijven natuurlijk uitermate belangrijk omdat niet alle content XML gebaseerd is. Sterker nog: als je met sub-structuren in XML documenten wilt werken voldoet XPath van geen kant. Hiervoor zou je nog steeds heel goed reguliere expressies kunnen gebruiken, eventueel gecombineerd met XPath.

Reguliere expressies zijn vooral praktisch voor het valideren van kleinere structuren zoals user-input. Voor grote structuren werkt het gewoon te onduidelijk (zie als bewijs dit probleem). Bij ingewikkelde syntax kan je toch beter met op het model van de file gaan werken: de abstract syntax tree. Je maakt dit model door gebruik te maken van een parser. Het idee achter reguliere expressies zie je natuurlijk nog op heel veel plekken in de informatica terug. Reguliere expressies om series van tekens te valideren is maar 1 van de vele toepassingen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
zozo als je er ff niet bent
beginnen zo over iets anders te praten :(

maar goed
ik zal morge ook maar eens gaan kijken of het me allemaal lukt
Pagina: 1