[php] Een regular expression puzzel

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste allemaal, hier een vraag voor gevorderden in regular expressions.

Van de volgende string:

'......<HTMLCODE ID="een">.........</HTMLCODE>.....<HTMLCODE ID="twee">.........</HTMLCODE>.....'

(waarbij de puntjes allerlei andere HTML code en tekst vertegenwoordigen)

moet het gedeelte '<HTMLCODE ID="een">.........</HTMLCODE>' vervangen worden


De volgende PHP code komt in de buurt

PHP:
1
2
3
4
5
6
$content = '......<HTMLCODE ID="een">.........</HTMLCODE>.....<HTMLCODE ID="twee">.........</HTMLCODE>.....';
$vervangende_string = 'nieuwe tekst';

$pattern  = '(<HTMLCODE ID="een">).*(</HTMLCODE>)';
$replace  = '\\1' . $vervangende_string . '\\2';
$result   = ereg_replace($pattern, $replace, $content);


als het niet was voor het feit dat ereg_replace in dit geval een replacement uitvoert van '<HTMLCODE ID="een">' tot en met de LAATSTE '</HTMLCODE>', waardoor het tweede HTMLCODE blok verwijderd wordt.

Het doel is om juist tot en met de eerstvolgende '</HTMLCODE>' te komen.


Middels de volgende poging, waarvan de rest van de code hetzelfde blijft:

PHP:
1
$pattern  = '(<HTMLCODE ID="een">)[^(<HTMLCODE)]*(</HTMLCODE>)';


probeerde ik ervoor te zorgen dat hij alleen mag replacen als er tussen de openingscode en sluitcode niet nog een openingscode staat. Echter, ik geloof niet dat je op deze manier een complete string (<HTMLCODE) kan matchen.


Wie o wie kan mij helpen met het oplossen van bovenstaande situatie, zij het op een andere manier dan met regular expressions. Al moet het wel te doen zijn zou je zeggen.

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 18:37

crisp

Devver

Pixelated

een ungreedy replace doen:

PHP:
1
2
3
$pattern = '/(<HTMLCODE ID="een">).*(<\/HTMLCODE>)/Uis';
$replace  = '\\1' . $vervangende_string . '\\2'; 
$result   = preg_replace($pattern, $replace, $content);


oh ja, en de / in /HTMLCODE escapen ;)

nb; de U modifier maakt 'm dus ungreedy; de i staat voor case-insensitive, en de s voor line-spanning. Voor zover ik weet kunnen dit soort dingen alleen met de PCRE syntax (hence de preg_replace) en niet met de POSIX syntax

[ Voor 78% gewijzigd door crisp op 02-04-2003 00:16 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Super. Precies wat ik nodig had :)

De Ungreedy modifier zorgt voor een hoop gemak, wetende dat je dan niet tussen de openings en sluitcode hoeft aan te geven waar vooral NIET op gematch moet worden.

Thanks!