[PHP] \r\n-probleem *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sorcerer8472
  • Registratie: Januari 2002
  • Laatst online: 12:50
Ik ben bezig een aanvullende webadmin voor Unreal Tournament te bouwen waarin o.a. mods aan-/uitgezet kunnen worden. Het script moet werken onder Linux. Probleem is alleen dat .ini-files van UT aan het einde van elke regel een 0D0A bevatten. Met andere woorden een \r\n.

Niet zo'n probleem met parsen zou je zeggen. Dat doe je gewoon even. Maar om één of andere reden pakt hij het helemaal niet.

Ik doe het volgende:
PHP:
1
2
$nieuwestring = ereg_replace("\\[UTServerAdmin\.UTServerAdmin\]\r\nAdminUsername=(.*)\r\nAdminPassword=(.*)",
         "[UTServerAdmin.UTServerAdmin]\r\nAdminUsername=\\1\r\nAdminPassword=$newpass",$oudestring);

Ik wil met dit stukje code uit de inifile het AdminPassword laten vervangen. Echter hij geeft precies dezelfde regel code terug, zonder aanpassingen.

Als ik in vim precies hetzelfde stukje tekst aanmaak en dat dan met \n parse, werkt het correct. Ligt dus echt aan die returns. Chr(10) en Chr(13) gebruiken gaf hetzelfde effect als \r\n trouwens.

Iemand een idee hoe ik dit werkend kan krijgen? Alvast bedankt :)

[ Voor 27% gewijzigd door curry684 op 08-06-2003 15:51 ]

Reality is merely an illusion, albeit a very persistent one.


Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt iig even alle \r's er uit halen (str_replace("\r", '', $oudestring)) :)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Misschien dat preg_replace hier beter in werkt, sommige regexp-libraries beschouwen (meen ik) de line-end als een einde van de zoektocht voor de regexp-match.

Bij preg_replace kan je dat met de /s operator aangeven ala:
preg_replace('/.../s', ...);

Btw, linux-line-endings eindigen normaliter op \n niet op \r\n, misschien dat je daarmee een probleem hebt? Of ben je zeker van die \r\n (in vim staat er dan onderaan 'dos' oid)

Acties:
  • 0 Henk 'm!

  • Sorcerer8472
  • Registratie: Januari 2002
  • Laatst online: 12:50
ACM schreef op 08 June 2003 @ 15:55:
Misschien dat preg_replace hier beter in werkt, sommige regexp-libraries beschouwen (meen ik) de line-end als een einde van de zoektocht voor de regexp-match.

Bij preg_replace kan je dat met de /s operator aangeven ala:
preg_replace('/.../s', ...);

Btw, linux-line-endings eindigen normaliter op \n niet op \r\n, misschien dat je daarmee een probleem hebt? Of ben je zeker van die \r\n (in vim staat er dan onderaan 'dos' oid)
Er staat inderdaad 'dos' onderaan. Maargoed, ik ga even de syntax van preg_replace doornemen. Kijken of dat beter werkt :)

Reality is merely an illusion, albeit a very persistent one.


Acties:
  • 0 Henk 'm!

  • Sorcerer8472
  • Registratie: Januari 2002
  • Laatst online: 12:50
PHP:
1
2
3
4
<?
$nieuwestring = ereg_replace("\\[UTServerAdmin\.UTServerAdmin\]\r\nAdminUsername=(.*)\r\nAdminPassword=(.*)", 
         "[UTServerAdmin.UTServerAdmin]\r\nAdminUsername=\\1\r\nAdminPassword=$newpass",$oudestring);
?> 


Het probleem was dus het gebruik van (.*), wat indirect een negatieve uitwerking had op het gebruik van \r om één of andere vage reden. Door .* wilde hij namelijk ALLES na een bepaalde waarde vervangen...
Gebruik van ([a-zA-Z]*) heeft het opgelost. Werkt goed samen met \r\n.

Van preg_replace snapte ik trouwens helemaal niks :P Die voorbeelden op php.net mogen toch wel wat duidelijker vind ik :)

Bedankt voor de reacties in ieder geval! :)

[ Voor 7% gewijzigd door Sorcerer8472 op 08-06-2003 17:28 ]

Reality is merely an illusion, albeit a very persistent one.


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 13:29
.* matcht greedy, wat wil zeggen dat het zoveel mogelijk matcht. Met .*? wordt zo min mogelijk gematcht.
Met [a-zA-Z]* kan het fout gaan als iemand een underscore of een getal in zijn naam of password heeft (ik neem aan dat dat mag van UT :)).
Voor het inlezen van de .ini file kan je ook gebruik maken van parse_ini_file(). Voor het wegschrijven naar een nieuwe .ini file bestaan voor zover ik weet geen standaard functie, maar het is niet zo moeilijk om die functie zelf te schrijven.

Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

verschil met preg_replace is dat het werkt "per regel" en ereg_replace daartegen een hele file bijv. ongeacht de "\r\n" (mits de regexp correct is)
Sorcerer8472 schreef op 08 juni 2003 @ 17:28:
...
Van preg_replace snapte ik trouwens helemaal niks :P Die voorbeelden op php.net mogen toch wel wat duidelijker vind ik :)

...
bij een preg_replace regexp moet je een begin delimeter mee geven en een end delimeter...
zodat je dus een start en een einde van een regel aanduid.

PHP:
1
2
$string = 2003-06-09;
echo preg_replace ("[b]/[/b](19|20)(\d{2})(.*)[b]/[/b]", "\\1\\2", $string);

output: 2003

fouten onder voorbehoud :) *hiks* *toost* ! :7

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Kwai_gon_jinn:
verschil met preg_replace is dat het werkt "per regel" en ereg_replace daartegen een hele file bijv. ongeacht de "\r\n" (mits de regexp correct is)
Mind you de pcre manual er eens op na te kijken en te zien wat er staat bij de 'm' modifier in Pattern Modifiers. Juist, multi-line. Dat neemt niet weg dat het '.' (dot-) metacharacter default geen newlines matcht. Maar daar hebben we dan weer de 's' modifier voor. Kortom: het werkt per regel is strict genomen onzin ;)
bij een preg_replace regexp moet je een begin delimeter mee geven en een end delimeter...
zodat je dus een start en een einde van een regel aanduid.
De delimiters geven enkel het begin en eind van het patroon aan. In de pcre betekent dit dat de delimiters het patroon scheiden van de (bovengenoemde) modifiers. Daar waar de pcre modifiers heeft, heeft de POSIX-regexes die niet. Vandaar dat de posix-re geen delimiters heeft.

ftr: de ^ en de $ duiden in single-line re's het begin en eind van de regel aan. In multi-line geven ze het begin en eind van de subject-string aan.
PHP:
1
2
$string = 2003-06-09;
echo preg_replace ("[b]/[/b](19|20)(\d{2})(.*)[b]/[/b]", "\\1\\2", $string);

output: 2003
Nu we het toch over delimiters hebben..... waar zijn die van jou? ;)
fouten onder voorbehoud :) *hiks* *toost* ! :7
Da's dus niet voor niets :Y)

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

Pagina: 1