[php] vrij ingewikkelde regexp

Pagina: 1
Acties:
  • 42 views sinds 30-01-2008

  • BKJ
  • Registratie: April 2000
  • Laatst online: 16-04 16:06
Ik wil een bestaande website aanpassen en daarin staat de volgende code:

code:
1
<option>Den Bosch</option>


Nu wil ik de code veranderen in:

code:
1
<option value="Den Bosch">Den Bosch</option>


Nu kan dat met de hand maar dat lijkt me vrij onzinnig omdat er vast wel een prima regexp voor te vinden is. probleem is alleen dat ik niet precies weet hoe, en dan vooral het feit dat je gegevens van NA > en voor < betrekt in je opdracht. > vervangen door value=""> lukt nog wel....

Kamer huren


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 24-04 11:26
PHP:
1
2
while(eregi("<option>([^<]+)</option>", $body, $regs))
  $body = str_replace($regs[0], "<option value=\"{$regs[1]}\">{$regs[1]}</option>", $body);


?

[ Voor 71% gewijzigd door frickY op 05-10-2005 19:15 ]


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Wat heb je al wel aan regex geschreven ?

iets als
code:
1
/<(option)>(.*?)</\\1>/i
moet eigenlijk wel genoeg zijn om iig de juiste data eruit te plukken..

(waarom option een aparte match? Ik ben lui, _heel_ lui)

@hierboven, preg_match_all of preg_replace is waarschijnlijk wat handiger, fijner, en perl-compatibiler

[ Voor 24% gewijzigd door GX op 05-10-2005 19:01 ]


  • BKJ
  • Registratie: April 2000
  • Laatst online: 16-04 16:06
frickY schreef op woensdag 05 oktober 2005 @ 19:00:
PHP:
1
2
while(eregi("<option>([A-Z ]+)</option>", $body, $regs))
  $body = ereg_replace($regs[0], "<option value=\"{$regs[1]}\">{$regs[1]}</option>", $body);


?
Briljant....het werkt...toch maar es regexps voor dummies kopen. Hoewel dit er wel logisch uitziet, maar zo oplepelen als jij lukt me nog niet.

edit:

er bestaan ook plaatsnamen met punten en streepjes :)

[ Voor 16% gewijzigd door BKJ op 05-10-2005 19:08 ]

Kamer huren


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 24-04 11:26
Ik heb hem ge-edit.. hij kan nu alles bevatten behalve het '<'-teken. En die zou hij ook niet mogen bevatten, daarvoor zou immers de html-entitiet &lt; gebruikt moeten worden.
Mocht mn nieuwe edit niet werken moet je de '<' even escapen door er een backslash voor te zetten, maar volgens mij zou hij het zo moeten doen.
Heb de ereg_replace ook maar vervangen door een str_replace. Werkt net zo goed, zonde van de overhead B)

Ikzelf heb me de PHP regexps wijs gemaakt door een paar keer op je gemakje de PHP-documentatie (en user-notes) door te bladeren, en het vooral heel, heel vaak fout doen :P
Maar als je het idee eenmaal doorhebt is het een eitje. preg_match() snap ik overigens ook (nog) niet :?

[ Voor 48% gewijzigd door frickY op 05-10-2005 19:18 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

frickY, om te beginnen vind ik het raar dat je een while-constructie gebruikt in plaats van gewoon een ereg_replace, die beide operaties in eens kan doen. Verder: Perl compatible regular expressions (PCRE), de preg-functies in PHP, zijn sneller dan POSIX regular expressions, de ereg-functies in PHP, en bieden bovendien meer mogelijkheden. Ik zou het dan ook, zoals GX al zegt, oplossen als volgt:
PHP:
1
preg_replace("#<option>(.*)</option>/iU", '<option value="\\1">\\1</option>', $tekst);


Verder, @hitchhacker: zo'n ingewikkelde regexp is dit helemaal niet. Sterker nog, eenvoudiger dan dit zul je een zinnige regexp niet gaan krijgen. Je had hier prima uit kunnen komen door een beetje in de documentatie te bladeren. Bovendien mis ik in je startpost een groot stuk eigen inzet: je zegt eigenlijk alleen maar wat je hebt en waar je naartoe wil, niet wat je al geprobeerd hebt. Dicht dus. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.