[php] regexp

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Hallo,
Ik ben al een tijdje aan het proberen uit te zoeken hoe ik het volgende kan realiseren met preg_replace();

Ik wil bijvoorbeeld een * Saven tag maken, like dit:
code:
1
2
3
Haha
/me wil dit niet doen
maarja doe anders maar .............

Ik wil dus dat hij bijvoorbeeld de * Saven en dan alleen deze regel pakt.
Dus dat hij na een newline niet meer verder gaat, maar alles alleen op de huidige regel.

Ik heb me sufgezocht maar ik vond eigenlijk geen bruikbare resultaten.
Zou iemand mij kunnen matsen en mij hierbij helpen?

Alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Je bent al een tijdje aan het uitzoeken geweest hoe je het moet doen.
Je hebt een goede techniek gevonden (regular expressions) maar je vertelt niet wat je daarmee geprobeerd hebt en wat er precies niet lukte.

Is het de expressie die niet matched of het gebruik van de php functie preg_replace waar je problemen mee hebt?

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • graceful
  • Registratie: Maart 2008
  • Niet online
Ik neem aan dat het om de expressie gaat. Nou moet ik zeggen dat ik ook geen regexp pro ben, maar volgens mij moet dat via negative replacement wel lukken:

code:
1
/\/me (.*)(?!\s)/si


Enige wat je dan nog moet checken of de tweede (\\2) geen newline is, is dat zo, bevat het de laatste letter van de zin.

[ Voor 67% gewijzigd door graceful op 01-03-2009 20:04 . Reden: Newline naar \s, info over non-newline ]


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
PHP:
1
$str = preg_replace('#\/me (.*?)\\n#si', 'ME: \\1', $str);

maar als * Saven bericht helemaal onderaan staat (en er dus geen newline is) doet hij het niet. en ik weet ff niet hoe je dat als optional kunt maken zegmaar :P

Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Volgens mij hoef je geen rekening te houden met wat voor new lines er gebruikt zijn, je geeft aan dat je alleen single lines wilt verwerken met de modifier s
dit zou dan voldoen:
code:
1
#/me (.*)#si


Verder hoef je je backslashes niet te escapen als je het tussen singlequotes zet ;)

[ Voor 0% gewijzigd door KompjoeFriek op 01-03-2009 19:42 . Reden: non greedy to greedy ;) ]

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
KompjoeFriek schreef op zondag 01 maart 2009 @ 19:35:
Volgens mij hoef je geen rekening te houden met wat voor new lines er gebruikt zijn, je geeft aan dat je alleen single lines wilt verwerken met de modifier s
dit zou dan voldoen:
code:
1
#/me (.*)#si


Verder hoef je je backslashes niet te escapen als je het tussen singlequotes zet ;)
Hehe thnx :) wist ik niet
maar daar pakt hij de allerlaatste regel weer niet.

edit: en pakt hij gewoon meerdere lines

[ Voor 9% gewijzigd door Saven op 01-03-2009 20:00 ]


Acties:
  • 0 Henk 'm!

  • mimic
  • Registratie: Februari 2002
  • Niet online

mimic

O ja joh?

Saven schreef op zondag 01 maart 2009 @ 19:54:
[...]
edit: en pakt hij gewoon meerdere lines
Kwestie van testen. Het wordt nu praktisch in je schoot geworpen.

Veel succes!

Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Saven schreef op zondag 01 maart 2009 @ 19:54:
[...]
edit: en pakt hij gewoon meerdere lines
Je hebt gelijk, maar hij pakt niet 'gewoon' meerdere lines. Hij pakt meerdere lines omdat je het opgedragen hebt.
/s enables "single-line mode". In this mode, the dot matches newlines.
Regular expressions werken standaard per regel. Die s modifier heb je helemaal niet nodig.

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

Topicstarter
Thnx ik ben er uit idd :)!

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 22-09 15:11
Post dan voor de volledigheid de juiste oplossing ook nog even

In ieder geval zou dit moeten werken;
PHP:
1
preg_match("#/me\s([^\r\n]+)$#m");

Met de m-modifier ga je in multiline modus, waardoor de $ ook regeleindes matched.

Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Helaas matched dat alleen de laatste "/me" bij de volgende input:
PHP:
1
2
3
4
$src = 'Haha
/me wil dit niet doen
maarja doe anders maar .............
/me test.';
Zelf had ik dit:
PHP:
1
$src = preg_replace('#/me (.*)#i', 'ME: \1', $src);
Wat het volgende antwoord oplevert:
code:
1
2
3
4
Haha
ME: wil dit niet doen
maarja doe anders maar .............
ME: test.

WhatPulse! - Rosetta@Home - Docking@Home

Pagina: 1