[php] regular expression

Pagina: 1
Acties:

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Hoe kan je een uitzondering maken in een RE? Ik bedoel zoiets:

Het woord 'boe' moet vervangen worden door 'bla', maar niet als het tussen aanhalingstekens staat. Dus dit:

boe "hier staat ook boe enzo" nog meer boe.

wordt dan:

bla "hier staat ook boe enzo" nog meer bla.

Iets vervangen gaat prima met preg_replace, maar hier kom ik effe niet uit...

Edit: kan dit uberhaubt wel? :?

[ specs ] [ Tweaker gallery ]


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023

Verwijderd

Alles kan.. alleen de vraag is.. krijg jij het voor elkaar!!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 28-08 20:56

Knutselsmurf

LED's make things better

Verwijderd schreef op 02 november 2002 @ 01:31:
Alles kan.. alleen de vraag is.. krijg jij het voor elkaar!!
Kom op zeg. Hou anders je mond ofzo.... :/ :/

Maar even weer ontopic. Stap 1 is het herkennen van gequote tekst. Daarna kun je een uitzondering maken voor stukken tekst die hier aan voldoen. Met andere woorden, los het probleem met kleine stapjes tegelijk op.
BTW, heb je al nagedacht wat er in een dergelijk geval moet gebeuren?:
code:
1
bla " nog een keer bla " en nog eens" en een laatste keer bla.

Welke tekst moet in dit geval als gequote gezien worden?

- This line is intentionally left blank -


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Knutselsmurf schreef op 02 november 2002 @ 02:38:
[...]

Kom op zeg. Hou anders je mond ofzo.... :/ :/
Thanks, sommige lui... |:(
Maar even weer ontopic. Stap 1 is het herkennen van gequote tekst. Daarna kun je een uitzondering maken voor stukken tekst die hier aan voldoen. Met andere woorden, los het probleem met kleine stapjes tegelijk op.
BTW, heb je al nagedacht wat er in een dergelijk geval moet gebeuren?:
code:
1
bla " nog een keer bla " en nog eens" en een laatste keer bla.

Welke tekst moet in dit geval als gequote gezien worden?
Back to school... Zo'n geval als hierboven zal niet voorkomen, gelukkig hoef ik daar niet bang voor te zijn.

En met assertions zou ik er wel moeten komen, lijkt me. Maar ik zie 'm nog niet. Begin en eind quote detecteren is niet zo'n probleem:

PHP:
1
$string = preg_replace("/\"(.*?)\"/i", "...iets...", $string);


En als er in die (.*?) dan 'boe' staat, mag dat niet 'bla' worden... Oke... :) :?

[ specs ] [ Tweaker gallery ]


  • Blubber
  • Registratie: Mei 2000
  • Niet online
PHP:
1
preg_replace("/^(.*)[^\"](bla)(.*)/", "\\1 Dit was bla \\3", $string)


Zoiets?

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 23-08 13:31

Tjark

DON'T PANIC

die is niet goed denk ik:
code:
1
(.*)[^\"]

is hetzelfde eigenlijk als
code:
1
(.*)


maar ik weet niet hoe ik het in 1 stap zou moeten doen als er staat:

xxx boe xxx" xxx boe xxx " xxx boe xxx boe xxx

Dan misschien in 4 stappen:
PHP:
1
2
3
4
5
if ( preg_match("/^(.*?)(\".*\")(.*)$/",$str,$matches) ) {
  $matches[1] = str_replace('boe', 'bla', $matches[1]);
  $matches[3] = str_replace('boe', 'bla', $matches[3]);
  $str = $matches[1].$matches[2].$matches[3];
}


zo, mooi ifje er omheen :)

*insert signature here


  • Blubber
  • Registratie: Mei 2000
  • Niet online
TjarkVerhoeven schreef op 02 november 2002 @ 11:27:
die is niet goed denk ik:
code:
1
(.*)[^\"]

is hetzelfde eigenlijk als
code:
1
(.*)
Weet ik, maar ik ben net wakker. Ik ik wou \\1 afvangen, maar als je die [^\"] tussen () zet heb je hetzelfde effect idd :)]

PHP:
1
preg_replace("/^([^\"]+)bla(.*)$/i", "\\1 dit was bla \\2", $string);


zo beter?

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 23-08 13:31

Tjark

DON'T PANIC

Heb ff een andere oplossing in m'n post hierboven gezet.

*insert signature here


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Damn... dns error... tekst weg... |:( overnieuw...
TjarkVerhoeven schreef op 02 november 2002 @ 11:27:

maar ik weet niet hoe ik het in 1 stap zou moeten doen als er staat:

xxx boe xxx" xxx boe xxx " xxx boe xxx boe xxx
Nee, daar zit ik ook mee.
Die RE van Blubber werkt dan ook helaas niet.
Dan misschien in 4 stappen:
PHP:
1
2
3
4
5
if ( preg_match("/^(.*?)(\".*\")(.*)$/",$str,$matches) ) {
  $matches[1] = str_replace('boe', 'bla', $matches[1]);
  $matches[3] = str_replace('boe', 'bla', $matches[3]);
  $str = $matches[1].$matches[2].$matches[3];
}


zo, mooi ifje er omheen :)
Die werkt echter wel goed!
Ik ga hier eens mee aan de gang, bedankt!

Edit: Alleen, wat doe je nu met zoiets:

PHP:
1
$str = "boe \"hier staat ook boe enzo\" nog meer boe.\"hier boe ook\" en nog een boe zo";


Die 3e 'boe' blijft een 'boe'. Klopt, zou je zeggen, maar moet eigenlijk een 'bla' worden. }:O De tekst tussen quotes staat er voor ('hier staat ook boe enzo') en erna ('hier boe ook') en de tekst 'nog meer boe' staat dus eigenlijk niet tussen quotes...

Hmmm... dit valt nog niet mee!

[ specs ] [ Tweaker gallery ]


  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 23-08 13:31

Tjark

DON'T PANIC

Maar je zei dat dat niet zou voorkomen? :
Explore schreef op 02 november 2002 @ 11:14:
[...]
Back to school... Zo'n geval als hierboven zal niet voorkomen, gelukkig hoef ik daar niet bang voor te zijn.
Dan blijven er 2 opties over:

- algorithme dat bijhoudt of je 'binnen quotes' bent of 'buiten quotes' en alleen de boes vervangt als hij buiten quotes is

- recursieve functie schrijven die de #matches[3] doorgeeft aan zichzelf om te kijken of er nog quoted gedeeltes zijn.

*insert signature here


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
[quote]TjarkVerhoeven schreef op 02 november 2002 @ 13:04:
Maar je zei dat dat niet zou voorkomen? :
[quote]

Eh, ja je had 3 quotes... :)
Dan blijven er 2 opties over:

- algorithme dat bijhoudt of je 'binnen quotes' bent of 'buiten quotes' en alleen de boes vervangt als hij buiten quotes is

- recursieve functie schrijven die de #matches[3] doorgeeft aan zichzelf om te kijken of er nog quoted gedeeltes zijn.
Hmja, ik ben bang dat je een punt hebt... 'k Zal er eens over nadenken. Ik ben in iedergeval een stuk op weg geholpen. Thanks!

[ specs ] [ Tweaker gallery ]


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
'k Heb wat verder zitten pielen, en zo kan 't ook:

PHP:
1
2
3
4
5
6
7
8
9
$string = "boe \"hier staat ook boe enzo\" nog meer boe. \"hier boe ook\" en nog een boe zo";
$splitted = split("\"", $string);
$nSplits = count($splitted);
for ($i = 0; $i < $nSplits; $i++) {
    if ($i % 2 == 0) $splitted[$i] = preg_replace("/boe/i", "bla", $splitted[$i]);
    else $splitted[$i] = "\"".$splitted[$i]."\"";
}
$string = join("", $splitted);
echo $string;

[ specs ] [ Tweaker gallery ]


  • wacco
  • Registratie: Augustus 2002
  • Laatst online: 21-03-2023

wacco

cli, hlt.

Ik wou net zeggen, gewoon eerst opbreken die meuk, en dan de eerste (desnoods) wel vervangen, tweede string negeren, derde weer (desnoods) vervangen, etc etc.
Ik zou dus iets van Explore's code, alleen dan de for in stappen van twee, en kijken of er wat vervangen moet worden (en weer samenvoegen).

...*bestudeer*...
Neej, explore's oplossing is beter :) Die geeft om de oneven stukken aanhalingstekens.
:X

Spolap: Interactive webcomic


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
:) Ja, die aanhalingstekens verdwijnen in de split.
Dit is op zich een aardige oplossing, alleen ben ik er nog niet helemaal...
Je hebt nl. ook strings met single quotes... |:( doh!
Split kan, dacht ik, wel re's aan, dus ik zou zoiets kunnen doen:

PHP:
1
split("(\"|')", $line);


Maar hoe weet ik dan welke quote ik moet terugplaatsen op de oneven stukken?

[ specs ] [ Tweaker gallery ]


Verwijderd

de string karakter voor karakter (naja bijna, met strpos dus) doorlopen en bijhouden of je in een quote zit, En ondertussen ook nog kijken of er ergens boe staat en dan aan de hand van de waarde van $inQuotes kijken of je hem wel of niet moet vervangen :D

  • wacco
  • Registratie: Augustus 2002
  • Laatst online: 21-03-2023

wacco

cli, hlt.

En als je nou ff je string split op de ", boe's vervangt, samenvoegt, split op ', boe's vervangt en weer samenvoegt?

Spolap: Interactive webcomic


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 28-08 20:56

Knutselsmurf

LED's make things better

wacco schreef op 07 november 2002 @ 12:11:
En als je nou ff je string split op de ", boe's vervangt, samenvoegt, split op ', boe's vervangt en weer samenvoegt?
Het vervelende is, dat er in dit soort situaties altijd randgevallen zijn, zoals:

code:
1
boe " boe ' boe " boe ' boe

Welke worden wel en welke niet vervangen?

Misschien is een optie om de boel dan als volgt om te zetten:
code:
1
2
3
4
5
6
7
8
9
boe
"
boe
'
boe
"
boe
'
boe

Dus in een array waarbij ook de quotes opgenomen zijn. En hierna op selectieve elementen een zoek-en-vervang loslaten, zodat het resultaat
code:
1
2
3
4
5
6
7
8
9
ba
"
boe
'
ba
"
boe
'
ba

wordt. Dit kun je daarna weer aan elkaar plakken.

- This line is intentionally left blank -


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Mijn eerste reactie op dit:

code:
1
boe " boe ' boe " boe ' boe


was: dat komt niet voor, aangezien het er uit zien als incorrect nesten. Maar het is juist heel goed mogelijk dat er een single quote in een double-quoted string voorkomt. Dit dus:

code:
1
boe " boe ' boe " boe


En het kan best zijn dat er later in hetzelfde tekstblok nog een single-quoted string staat. Dus dan krijg je dit:

code:
1
boe " boe ' boe " boe ' boe ' boe


bijvoorbeeld...

Maar op zich zou dat geen probleem moeten zijn. Het enige punt is: wat geef je voorrang?

Als je bv. eerst split op " dan krijg je een heel ander resultaat dan als je eerst split op '...
De tip van wacco is op zich wel interessant.

Ik ga dit later testen. Vandaag weer verder werken.
Wat is een weekend ook al weer? :?

[ specs ] [ Tweaker gallery ]

Pagina: 1