Toon posts:

PHP regular expressions

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik had een vraagje over regular expressions, welke luidt als volgt:

Ik heb een stuk tekst in een MySQL database staan in de trend van: "Gisteravond gingen Jan en Jan stappen.". Nou wil ik graag de namen Jan en Jan veranderen in Piet en Kees. Ik heb al vele dingen geprobeerd, maar verder dan dit kwam ik niet:

PHP:
1
2
3
4
5
$result = mysql_query("select * from tekst");
while ($row = mysql_fetch_array($result)) {
  $data = ereg_replace("Jan", $row[1], $data);
}
echo($data);


Kan iemand mij uitleggen wat ik fout doe en waar je goede informatie hierover kan vinden. Alle POSIX en PERL pagina's die ik vind over dit onderwerp geven mij weinig verdere informatie.

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 14-12-2025
Verwijderd schreef op 11 augustus 2002 @ 22:06:
[...snip...]
Kan iemand mij uitleggen wat ik fout doe en waar je goede informatie hierover kan vinden. Alle POSIX en PERL pagina's die ik vind over dit onderwerp geven mij weinig verdere informatie.
Regex in /14 FAQ
links over regex in /14 FAQ

[ Voor 0% gewijzigd door martinvw op 11-08-2002 22:13 . Reden: 2 links :D ]


Verwijderd

Topicstarter
Hardstikke bedankt voor de links, maar ze geven me nog steeds hetzelfde antwoord als die andere pagina's, namenlijk dat je de "greedy-ness" van een expressie moet uitzetten, wat dus blijkbaar niet lukt aangezien hij alle 2 de namen veranderd.

Ik had in mijn bovenstaande verhaaltje overigens wel een fout gemaakt, het moet als volgt zijn: in de database heb ik de namen Piet en Kees staan en in $data staat het verhaaltje.

PHP:
1
2
3
4
5
6
$result = mysql_query("select * from tekst"); 
while ($row = mysql_fetch_array($result)) { 
  $data = ereg_replace("Jan{1}", $row[1], $data); 
} 
echo($data);
?> 


Of dit volgende (wat volgens een andere manual goed was):

PHP:
1
2
3
4
5
6
$result = mysql_query("select * from tekst"); 
while ($row = mysql_fetch_array($result)) { 
  $data = ereg_replace("Jan?", $row[1], $data); 
} 
echo($data);
?> 


Krijg ik nog steeds dat de beide Jan's met de naam Piet worden overschreven i.p.v. eerst de naam Piet en dan Kees

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

Tjark

DON'T PANIC

1. greediness beperkt je idd met een ? maar dan moet je het gedeelte wel groeperen.

2. kijk eens naar de functie preg_replace.

3. Werk de hele manual van php.net door en lees wat alle functies (kunnen) doen. Lijkt veel werk, maar het zal je werk besparen omdat je dan niet een uur loopt te kloten met iets dan in 1 regel op te lossen is door een standaard functie te gebruiken (maar dat heb je niet gedaan omdat je die functie niet kende en dus blijkbaar niet RTFM hebt gedaan :) )

*insert signature here


Verwijderd

Topicstarter
Hardstikke bedankt!

Ja sorry, maar ik heb een beetje een tijdslimiet om iets voor elkaar te krijgen dus veel tijd om PHP verder te bestuderen dan de basis heb ik niet echt jammer genoeg :'(

(sorry, moest even een taalkundige wijziging doen)

  • Spooksel
  • Registratie: Oktober 2000
  • Laatst online: 09:40

Spooksel

Spooksel!

edit: nm ik lees het weer eens niet goed :)

Bevalt mijn schrijfsel je niet? www.korrelatie.nl


Verwijderd

Euh.... als je alleen een simpeldepimpele replace wil doen, waarom gebruik je dan niet gewoon str_replace() ?

Verwijderd

Verwijderd schreef op 11 augustus 2002 @ 22:41:
PHP:
1
2
3
4
5
$result = mysql_query("select * from tekst"); 
while ($row = mysql_fetch_array($result)) { 
  $data = ereg_replace("Jan{1}", $row[1], $data); 
} 
echo($data);
Je kan trouwens het beste ook echt de fields bij name noemen, dus:
PHP:
1
2
3
4
$rs = mysql_query("SELECT id, name, description, bla FROM text");
while ($row = mysql_fetch_row($rs)){
// doe hier iets ofzo
}

Op die manier weet je 100% zeker dat $row[1] 'name' is, en niet per ongeluk ("oeps, foutje, net table aangepast") 'description' oid.... ;)

Verwijderd

Je kan trouwens het beste ook echt de fields bij name noemen, dus:
en bij fetch row ze ook maar bij naam noemen:
while (list($id, $name, $description) = mysql_fetch_row($rs)) {

  • Stilgar
  • Registratie: Maart 2002
  • Niet online
Verwijderd schreef op 13 augustus 2002 @ 13:20:
[...]
en bij fetch row ze ook maar bij naam noemen:
while (list($id, $name, $description) = mysql_fetch_row($rs)) {
Waarom? Ik vind het veel netter om de waarden in een array te zetten met de veldnamen als key. Is veel makkelijker als je er vervolgens bewerkingen op wil doen (zoals stripslashes).

Verwijderd

mysql_fetch_array is een stuk langzamer dan mysql_fetch_row... that's why

  • Stilgar
  • Registratie: Maart 2002
  • Niet online
Verwijderd schreef op 13 augustus 2002 @ 13:59:
mysql_fetch_array is een stuk langzamer dan mysql_fetch_row... that's why
Ze zijn het op php.net niet met je eens:
An important thing to note is that using mysql_fetch_array() is not significantly slower than using mysql_fetch_row(), while it provides a significant added value.
http://www.php.net/manual/en/function.mysql-fetch-array.php

Anyway, of je nu fetch_array of fetch_row gebruikt, ik vind het handiger om de opgehaalde waarden in een array te laten staan, aangezien groepsbewerkingen dan een stuk makkelijker gaan. Met list alle veldwaarden in aparte variabelen zetten heeft imho geen toegevoegde waarde.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

en mysql_fetch_assoc is lekker toch het rielekste van allemaal :P


nog even aan de topicstarter:

PHP:
1
2
3
4
5
6
$alleWoeis = array ();
while ( list ( $woei ) = mysql_fetch_row ( $result ) ) {
   $alleWoeis [] = $woei;
}
$i = 0;
$str = preg_replace ( '/Jan/e', '$alleWoeis [ ($i ++) ]', $str );


iets dergelijks zou wel moeten werken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1