[php] regexp probleempje.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik wil alle <SPAN......></SPAN> tags uit een string halen en replacen met wat anders. Wat is de juiste regexp? Ik doe nu het volgende, maar dat werkt niet helemaal flex. Deze selecteert alleen <SPAN ??

PHP:
1
$x = preg_match_all("/\<SPAN [^\<\/SPAN>]*/i", $html_data, $resultaten);

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

ja tuurlijk
je moet opgeven WAT je na <SPAN wil hebben


geen oplossingen posten svp, laat de starter zelf maar klooien

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ehm ja, dat doe ik toch ook met [^\<\/SPAN>]*/ ?

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

kijk nou es goed
het eerste karakter na de <SPAN
wat is dat?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
een:

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

en hoe match je dat?
sjees moet het er wel uitsleuren he?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

Verwijderd

Mijn hemel, wat zijn we vriendelijk en behulpzaam...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

even vooruitlopen op de volgende fout :)

Dit: [^\<\/SPAN>]*

wat betekent een [ ] in een regexp? hoe wordt daarmee omgegaan?

En verder zie ik geen enkele replacement, alleen een selectie van alle matches.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
HINT!

[^<\/SPAN>]

is hetzelfde als:

[^APNS<>\/]

Got clue ? :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien helpt het als je onder woorden brengt wat je wilt matchen

Allereerst "<SPAN"
vervolgens alle chars, tot de '>'
vervolgens weer alle chars, tot de "</SPAN>"

zet dat maar 'ns om naar een regex

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee die replacement doe ik verderop. Het gaat in eerste instantie puur om de match.

Ah ik snap hem al, al die karakters moeten er in voorkomen als het tussen brackets staat. Dus die brackets weg moeten weg. Thanks voor de tips. Ik sleutel verder.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
/^<SPAN.*</SPAN>$/ ?? Ik ben nog niet helemaal zeker over die .*

Het gaat ook niet niet helemaal lekker met die /S volgens mij. Kan ik dit escapen ofzo?

[ Voor 47% gewijzigd door Verwijderd op 24-04-2003 12:11 ]


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

\

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

nou mis ik nog steeds een deel van deze regel:
.oisyn schreef op 24 april 2003 @ 12:01:
vervolgens alle chars, tot de '>'

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik hoef niet alle chars tot de > ik moet gewoon vanaf de <SPAN.......</SPAN> En dit wil ik vervangen.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

en dus ook iets als <SPANNEND>...</SPANNEND>...<SPAN>...</SPAN>? (wat dus nu matcht van begin tot eind)

[ Voor 21% gewijzigd door .oisyn op 24-04-2003 12:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, daar heb je een goed punt.
zo beter?: /^<SPAN.*>.*<\/SPAN>$/

En dan wil ik die match in een variabele gooien. Ik probeer op de volgende manier maar dat gaat niet helemaal lekker:

PHP:
1
$x = preg_match_all("/[^<SPAN.*>.*<\/SPAN>$]/i", $html_data, $resultaten);

[ Voor 66% gewijzigd door Verwijderd op 24-04-2003 12:36 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 24 April 2003 @ 12:23:
ok, daar heb je een goed punt.
zo beter?: /^<SPAN.*>.*<\/SPAN>$/

En dan wil ik die match in een variabele gooien. Ik probeer op de volgende manier maar dat gaat niet helemaal lekker:

PHP:
1
$x = preg_match_all("/[^<SPAN.*>.*<\/SPAN>$]/i", $html_data, $resultaten);
waarom gooi je het nou weer in een characterclass?
en die ^ en $ - ik denk dat er mogelijk nog wel meer in de string kan staan niet?
Verder hebben sommige tekens in een regexp een speciale betekenis; als je die wil matchen zal je ze moeten escapen (hoewel dat hier geloof ik niet nodig is).
Nog een dingetje waar je op moet letten is de greediness van je regexp; met de .* match ga je hier tegenaan lopen.
Ook zal je rekening moeten houden met line-spanning.
Als laatste wil je waarschijnlijk ook uit je resultaten kunnen halen wat er nou precies tussen je spans stond; hier zal je dus een subpattern voor moeten definieren.

veel suc6! :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op 24 April 2003 @ 13:07:
[...]

waarom gooi je het nou weer in een characterclass?
en die ^ en $ - ik denk dat er mogelijk nog wel meer in de string kan staan niet?
Verder hebben sommige tekens in een regexp een speciale betekenis; als je die wil matchen zal je ze moeten escapen (hoewel dat hier geloof ik niet nodig is).
Nog een dingetje waar je op moet letten is de greediness van je regexp; met de .* match ga je hier tegenaan lopen.
Ook zal je rekening moeten houden met line-spanning.
Als laatste wil je waarschijnlijk ook uit je resultaten kunnen halen wat er nou precies tussen je spans stond; hier zal je dus een subpattern voor moeten definieren.

veel suc6! :)
- Ok, characterklass haal ik weg.
- ^en $ gaat goed, er kan niet meer in de string staan.
- Dat met die subpattern vat ik niet helemaal. Ik wil namelijk niet weten wat er tussen die spans staat. Ik wil gewoon alle spans uit een string halen.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 24 April 2003 @ 13:25:
- ^en $ gaat goed, er kan niet meer in de string staan.
dan gooi je toch gewoon je string leeg?
- Dat met die subpattern vat ik niet helemaal. Ik wil namelijk niet weten wat er tussen die spans staat. Ik wil gewoon alle spans uit een string halen.
o, kunnen er toch meer spans in die string staan? Dat klopt dan niet met je bewering hier boven...

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
shit ja, damn. Ik pruts nog wel even verder.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
/<SPAN.*?SPAN>/ was het. Simpel eigenlijk.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

dus <spanspan> is ook goed? :+

Waarom niet zoiets:
PHP:
1
'/<span(>|.*?>).*?<\/span>/'

?

[ Voor 44% gewijzigd door ACM op 24-04-2003 14:53 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

PHP:
1
2
3
4
5
6
$text = 'dit is <spannend>een test met <span>een span</span> en een <spannend>spannend';

// vervang
$resultaat = preg_replace('/<SPAN.*?SPAN>/i', '___Hier stond de <span>___', $text);

echo $resultaat;


resultaat:

dit is ___Hier stond de <span>___een span</span> en een <spannend>spannend

mmz ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 24 April 2003 @ 14:51:
dus <spanspan> is ook goed? :+

Waarom niet zoiets:
PHP:
1
'/<span(>|.*?>).*?<\/span>/'

?
gaat ook mis op <spannend> volgens mij.
En waarom .*? en niet gewoon /U ?

Mijn versie:

PHP:
1
'/<span(>| .*>).*<\/span>/Uis'


;)

[ Voor 43% gewijzigd door crisp op 24-04-2003 15:01 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

ja, ik was die spatie vergeten :P

eigenlijk is zoiets nog beter:

PHP:
1
'/<span(\s+\S+(=.+)?)*>.*<\/span>/Uis'

Maar het wordt alweer vrij ingewikkeld zo, want je moet dan eigenlijk ook nog rekening houden met parameter-waarden tussen "" enzo en echt veel toegevoegde waarde heeft het niet, tenzij je alle parameters van de span wilt hebben ;)

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Zou je dan niet gewoon

code:
1
2
3
4
5
6
7
8
9
10
11
12
!
   <span           # allereerst <span
   (?:             # niet in de matches
      (            # dan OF
         >         # direct een >
      |            # OF
         \s[^>]*?> # een whitespace char gevolgd door NON >'s gevolg door een >
      )
   )
   (.*?)           # zo veel mogelijk matchen
   </span>         # tot de 'sluit'-span
!xi                # case insensitive and multilinecommentzut :)


Dit is dus niet getest .. heb al 6 maanden niet gecode .. erm .. tja .. zullen vast fouten in zitten. Ben niet tevreden met de (<|<......) structuur .. kan vast anders . Weet alleen niet hoe zonder te testen ;)

HTH .. :P

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 24 april 2003 @ 15:14:
ja, ik was die spatie vergeten :P

eigenlijk is zoiets nog beter:

PHP:
1
'/<span(\s+\S+(=.+)?)*>.*<\/span>/Uis'

Maar het wordt alweer vrij ingewikkeld zo, want je moet dan eigenlijk ook nog rekening houden met parameter-waarden tussen "" enzo en echt veel toegevoegde waarde heeft het niet, tenzij je alle parameters van de span wilt hebben ;)
juist, en dan heb je nog script in eventhandlers met nog meer toegestane tekens, dus dat heeft inderdaad weinig zin.
Sowieso als er in je HTML <FOO ..........> staat kan je aannemen dat het een tag is, anders had er &lt;FOO ......&gt; moeten staan ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Grum schreef op 24 April 2003 @ 15:29:
Zou je dan niet gewoon

code:
1
2
3
4
5
6
7
8
9
10
11
12
!
   <span           # allereerst <span
   (?:             # niet in de matches
      (            # dan OF
         >         # direct een >
      |            # OF
         \s[^>]*?> # een whitespace char gevolgd door NON >'s gevolg door een >
      )
   )
   (.*?)           # zo veel mogelijk matchen
   </span>         # tot de 'sluit'-span
!xi                # case insensitive and multilinecommentzut :)


Dit is dus niet getest .. heb al 6 maanden niet gecode .. erm .. tja .. zullen vast fouten in zitten. Ben niet tevreden met de (<|<......) structuur .. kan vast anders . Weet alleen niet hoe zonder te testen ;)

HTH .. :P
[^>]* is een methode die je eigenlijk alleen gebruikt als je alleen maar greedy regexps kan gebruiken (zoals bijvoorbeeld in javascript), juist doordat je in PHP een (deel van een) regexp als ungreedy kunt aanmerken heb je het voordeel dat je dat soort constructies niet hoeft te gebruiken.

[ Voor 4% gewijzigd door crisp op 24-04-2003 15:33 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
crisp schreef op 24 April 2003 @ 15:32:
[...]


[^>]* is een methode die je eigenlijk alleen gebruikt als je alleen maar greedy regexps kan gebruiken (zoals bijvoorbeeld in javascript), juist doordat je in PHP een (deel van een) regexp als ungreedy kunt aanmerken heb je het voordeel dat je dat soort constructies niet hoeft te gebruiken.
Al iets beter:

!<span(?:(\s[^>]*?)?>)(.*?)</span>!xi

of zoals jij dan zou doen:

!<span(?:(\s.*?)?>)(.*?)</span>!xi

weet niet wat 'lichter' is voor de regex engine maar dit zou beide moeten werken :)

Acties:
  • 0 Henk 'm!

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 12-09 09:30
haha, eerst word hier dus iemand belachelijk gemaakt omdat hij iets 'simpels' vraagt, en als hij dan een werkende oplossing heeft begint iedereen met de meest ingewikkelde oplossingen te gooien... :)

...ik heb die regular expressions ook nog nooit begrepen :P

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

_BRAINLESS schreef op 24 April 2003 @ 15:40:
haha, eerst word hier dus iemand belachelijk gemaakt omdat hij iets 'simpels' vraagt, en als hij dan een werkende oplossing heeft begint iedereen met de meest ingewikkelde oplossingen te gooien... :)

...ik heb die regular expressions ook nog nooit begrepen :P
Ik vind deze nog steeds wel mooi:
JavaScript:
1
2
var regExpr = new RegExp('(<\/[^<>]+>|<[^<>]+\/>|<(link|meta)[^<>]+>|<[^<>]+>(<\/[^<>]+>)?|[^<]+)', 'gi');
strString = strString.replace(regExpr, function($1) { return indent($1); });


zie: http://therealcrisp.xs4all.nl/upload/tidycode.html :)
Grum schreef op 24 April 2003 @ 15:38:
[...]


Al iets beter:

!<span(?:(\s[^>]*?)?>)(.*?)</span>!xi

of zoals jij dan zou doen:

!<span(?:(\s.*?)?>)(.*?)</span>!xi

weet niet wat 'lichter' is voor de regex engine maar dit zou beide moeten werken :)
Je zou eens moeten testen wat sneller is. Heeft perl (ik neem aan dat dit perl is gezien de switches) geen mogelijkheid om een hele regexp ungreedy te maken?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Grum eq Perl
dus ja perl style regex

* D2k ook recentelijk aan het regexen gegaan, maar Grum is (of was ;) ) er veeeeeeeeeeeel beter in ;)

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
jawel .. met U volgens mij .. maar ik code niet meer en heb dus ook geen access meer tot die rotzooi ;) wou ik houden ook ;)

Btw deze regexp zou behoren te werken in een preg_* functie

D2k: doe maar perl EN php :) (ooit dat wel ;))

_BRAINLESS schreef::
haha, eerst word hier dus iemand belachelijk gemaakt omdat hij iets 'simpels' vraagt, en als hij dan een werkende oplossing heeft begint iedereen met de meest ingewikkelde oplossingen te gooien... :)

...ik heb die regular expressions ook nog nooit begrepen :P


Ik maak niemand belachelijk. Het is een simpele vraag waarbij een passend antwoord gewoon wat lastiger is dan normaal. De oplossing van hem was 'werkend' maar niet foolproof genoeg, daarom komen er meer oplossingen.

Als je naar mijn 2e post kijkt dan zie je hoe simpel je een regex kan opbouwen en dat het helemaal niet zo lastig is. Maar net zoals met de rest van het coden, je moet weten wat het doet anders schiet het natuurlijk niet op :)

Regexen zijn dingen die je gewoon 1x goed moet leren en daarna is het NOG vaag en zal je veel dingen tegen komen waardoor je een tijd lang met je ogen staat te knipperen. Uiteindelijk zijn die beesten enorm handig en kan je ze voor vele toepassingen gebruiken.

BV een simpel stukje regex op een IP adres te controleren. Doe da in 'normale code' en zie wat voor pijn dat geeft.

[ Voor 106% gewijzigd door Grum op 24-04-2003 16:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tja, maar wie typt er nu spannend tussen gebroken haken in een zin? :D

Ik had overigens ook niet het idee belachelijk gemaakt te worden. Ik had een dergelijk antwoord wel verwacht, maar me = lui; en hoopte stiekum op een snel antwoord. Uiteindelijk was dit natuurlijk beter, aangezien ik er nu ook nog wat van opgestoken heb en misschien in de toekomst anderen hiermee kan helpen.

[ Voor 73% gewijzigd door Verwijderd op 24-04-2003 16:18 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Grum schreef op 24 April 2003 @ 15:50:
[...]
Btw deze regexp zou behoren te werken in een preg_* functie
[...]
PHP heeft de PCRE syntax (op de modifiers na) bijna geheel 1 op 1 overgenomen, dus de meeste perl-regexps werken inderdaad ook in de preg_ functies.
Ik gebruik met dit soort matches al gauw de /U modifier om de hele regexp ungreedy te maken; ik weet niet of dat in perl makkelijk kan.
Verwijderd schreef op 24 April 2003 @ 16:13:
Tja, maar wie typt er nu spannend tussen gebroken haken in een zin? :D

Ik had overigens ook niet het idee belachelijk gemaakt te worden. Ik had een dergelijk antwoord wel verwacht, maar me = lui; en hoopte stiekum op een snel antwoord. Uiteindelijk was dit natuurlijk beter, aangezien ik er nu ook nog wat van opgestoken heb en misschien in de toekomst anderen hiermee kan helpen.
En daar doen we het natuurlijk ook om: zodat jij er wat van opsteekt en allerminst om je belachelijk te maken :)
Hopelijk is het gelijk ook leerzaam voor anderen, regexpen zijn uiteindelijk wel logisch, maar het duurt vaak even voordat je het 'ziet'. Veel zelf prutsen hoort daarbij. Een simpele oplossing is er vaak ook niet (zoals je ziet) omdat regexpen eigenlijk al een soort programmeertaal op zich is, en je het probleem van meerdere kanten kan benaderen en oplossen.
De ene manier is misschien beter dan de andere, maar al naar gelang de complexiteit toeneemt neemt ook het aantal 'oplossingen' toe :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 15-07 09:34

PrinsEdje80

Holographic, not grated...

Misschien een heel handig programma om mee te werken is het volgende: Visual Regexp kun je testen wat je wilt met mooie highlighting

Used to be Down Under... Foto gallery

Pagina: 1