[php] regular expressions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil testen op het NIET voorkomen van een GROEP tekens, en mijn vraag is simpel: Hoe doe ik dat :?

vbtje:

ik wil boom vervangen door iets maar niet bom. Dit werkt dan niet:

code:
1
 "(b)([^oo])(m)"


Bestaat er een manier om dit te doen of moet ik er rond werken :?

ps: ja ik weet dat er voor dit vb wel een heeeeeel simpele opl bestaat maar kon ff op niets anders komen sorry :P

Acties:
  • 0 Henk 'm!

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03 09:11
in plaats van:
PHP:
1
2
3
4
if(eregi("(b)([^oo])(m)", $string))
{

}

PHP:
1
2
3
4
if(!eregi("(b)([^oo])(m)", $string))
{

}

gebruiken?

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het gaat hem over "[^oo]" .... Binnen de brackets worden alleen tekens genegeerd. Dus het voorkomen van een o gaat ie naar zoeken. Ik wil dat ie zoekt naar het voorkomen van een dubbele o (in dit geval).

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
code:
1
(?!oo)

Op 'negative lookahead' zoeken.

Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
uhm.. is dat niet [^o{2}] :?

Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
Verwijderd schreef op 20 december 2002 @ 09:28:
Het gaat hem over "[^oo]" .... Binnen de brackets worden alleen tekens genegeerd. Dus het voorkomen van een o gaat ie naar zoeken. Ik wil dat ie zoekt naar het voorkomen van een dubbele o (in dit geval).
ff quotje van php.net wat erg handig kan zijn bij reguliere crap :)
^ Start of String
$ End of string

n* Zero or more of 'n'
n+ One or more of 'n'
n? A possible 'n'

n{2} Exactly two of 'n'
n{2,} At least 2 or more of 'n'
n{2,4} From 2 to 4 of 'n'

() Parenthesis to group expressions
(n|a) Either 'n' or 'a'

. Any single character

[1-6] A number between 1 and 6
[c-h] A lower case character between c and h
[D-M] An upper case character between D and M
[^a-z] Absence of lower case a to z
[_a-zA-Z] An underscore or any letter of the alphabet

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

nikao:
uhm.. is dat niet [^o{2}] :?

Nee. Dat betekent namelijk: "op deze plek mag geen o, geen {, geen 2 en geen } voorkomen. Kortom, exact 'tzelfde als [^}{o2].

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nikao schreef op 20 december 2002 @ 15:56:
uhm.. is dat niet [^o{2}] :?
Uhm volgens mij werkt dat niet :?

Quoteje van phpbuilder:
Just don't forget that bracket expressions are an exception to that rule--inside them, all special characters, including the backslash ('\'), lose their special powers (i.e., "[*\+?{}.]" matches exactly any of the characters inside the brackets). And, as the regex man pages tell us: "To include a literal ']' in the list, make it the first character (following a possible '^'). To include a literal '-', make it the first or last character, or the second endpoint of a range."
Heb het wel niet in praktijk getest met o{2} maar wel met "[]" dus nam aan dat writer gelijk had. Heb vroeger al eens met reguliere expressies gewerkt maar vond niet meteen een oplossing hiervoor.

Het is voor die code-omzetting naar html, wat ik graag zelf zou schrijven (proberen toch). Ik wou proberen om te zetten als alleen beide tags er staan:

code:
1
2
3
4
$pattern = "/(\\[b\])(((?![b])|(.))*)(\\[\/b\])/";
$replace = "<b>\\2</b>";

$msg = preg_replace($pattern, $replace, $msg);


doet op zich wat ie moet doen MAAR bij dit soort situaties loopt het mis:

code:
1
2
3
$msg = "...[b]...[b]...[/b]...";

output: "...<b>...[b]...</b>..."


terwijl ik wil dat ie de 2de [b] neemt ...

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

Zorg dan dat je ungreedy matcht. Gebruik dus de U modifier van pcre of gebruik een ? na de * om de * ungreedy te maken.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Had ik niet aan gedacht ...

Maar
code:
1
$pattern = "/(\\[b\])(((?![b])|(.))*)(\\[\/b\])/U";

doet net hetzelfde :'(

[ Voor 6% gewijzigd door Verwijderd op 20-12-2002 17:44 ]


Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

hmja, maar je implementeert nu zelf een vorm van greediness door die lookahead assertion.
code:
1
~\\[b\](.*?)\\[/b\]~

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
drm schreef op 20 december 2002 @ 17:46:
hmja, maar je implementeert nu zelf een vorm van greediness door die lookahead assertion.
code:
1
~\\[b\](.*?)\\[/b\]~
True maar is in mijn geval weinig bruikbaar want dit zou verkeerd worden omgezet:
code:
1
[b]text1[/b]text2[b]text3[/b]
wordt volledig in bold gezet, terwijl dat niet echt de bedoeling is. Daarmee die lookahead assertion.

Dat ie nu het 1ste ipv het 2de result neemt om om te zetten, is nu zo erg niet, maar had het gewoon graag anders gezien :)

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 20 December 2002 @ 18:29:


Dat ie nu het 1ste ipv het 2de result neemt om om te zetten, is nu zo erg niet, maar had het gewoon graag anders gezien :)
Je hebt 'm niet geprobeerd neem ik aan? Hij doet namelijk exact wat jij wilt... (thanx to die *? constructie)

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

Verwijderd schreef op 20 December 2002 @ 18:29:
True maar is in mijn geval weinig bruikbaar want dit zou verkeerd worden omgezet:
code:
1
[b]text1[/b]text2[b]text3[/b]
wordt volledig in bold gezet, terwijl dat niet echt de bedoeling is. Daarmee die lookahead assertion.
Niet dus :) Daar heb je nou juist die ungreediness voor (note the '?').

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
drm schreef op 20 december 2002 @ 18:36:

Niet dus :) Daar heb je nou juist die ungreediness voor (note the '?').
Mes excuses !! :) Had er idd over gelezen. Dacht dat je bedoelde dat ik op dat pattern "U" modifier moest toepassen 8)7

Het werkt dus zoals je zei ... Merci _/-\o_
Pagina: 1