[PHP] regex en de \ (weer eens)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Ik probeer te zorgen dat je geen \ kan invoeren in een formfield met regex.
Maar kom er niet uit.

Heb nu als laatste:

PHP:
1
preg_match('/[^\\\]+$/', $var);


Heb al met + $ ^ van alles geprobeerd, maar kennelijk niet het juist :(

maar als ik \" of \\\\\" oid invoer vindt de regex het prima. Waar zit de fout?

edit: weet het inmiddels,
code:
1
 '/^[^\\\\]+$/'

regex kost me altijd veel tijd....

[ Voor 22% gewijzigd door Zoolander op 27-03-2005 04:15 ]

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Met enkele quotes zijn 2 slashes toch wel genoeg. Ik vind het altijd een beetje verwarrend hoe dat nou zit.

Overigens is het ook goed om van te voren met javascript al te controleren of er geen slash in zit. Dat scheelt de gebruiker wat moeite.

[ Voor 41% gewijzigd door Michali op 27-03-2005 10:43 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Anoniem: 26306

Michali schreef op zondag 27 maart 2005 @ 10:42:
Met enkele quotes zijn 2 slashes toch wel genoeg. Ik vind het altijd een beetje verwarrend hoe dat nou zit.
Het is eigenlijk heel simpel, maar ik zal het proberen zo uitgebreid mogelijk uit te leggen.

In strings die zijn delimited door enkele quotes, moet je de enkele quotes escapen met een backslash. De backslash zelf kun je dan ook escapen, maar dat hoeft niet altijd, omdat niet alle characters escapet kunnen of hoeven worden. Je mag een backslash wel altijd escapen, en dan krijg je in elk geval altijd het gewenste resultaat, je zou dus zeggen dat het verstandig is dat je een backslash altijd escapet als je die backslash letterlijk in de string wilt zetten.

Tot dusver is het zuiver PHP, en heeft het nog niks met regular expressions te maken. Maar de backslash wordt ook in regular expressions gebruikt om te escapen. Ook daar kun (en moet) je een letterlijke backslash altijd escapen. Dus als je in een regular expression, die je in een PHP string zet, een letterlijke backslash wilt matchen, heb je 4 backslashes nodig.
Overigens is het ook goed om van te voren met javascript al te controleren of er geen slash in zit. Dat scheelt de gebruiker wat moeite.
Dat zou kunnen, maar dat vind ik tegenwoordig niet zo heel belangrijk meer.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Anoniem: 26306 schreef op zondag 27 maart 2005 @ 11:12:
[...]

Het is eigenlijk heel simpel, maar ik zal het proberen zo uitgebreid mogelijk uit te leggen.

In strings die zijn delimited door enkele quotes, moet je de enkele quotes escapen met een backslash. De backslash zelf kun je dan ook escapen, maar dat hoeft niet altijd, omdat niet alle characters escapet kunnen of hoeven worden. Je mag een backslash wel altijd escapen, en dan krijg je in elk geval altijd het gewenste resultaat, je zou dus zeggen dat het verstandig is dat je een backslash altijd escapet als je die backslash letterlijk in de string wilt zetten.

Tot dusver is het zuiver PHP, en heeft het nog niks met regular expressions te maken. Maar de backslash wordt ook in regular expressions gebruikt om te escapen. Ook daar kun (en moet) je een letterlijke backslash altijd escapen. Dus als je in een regular expression, die je in een PHP string zet, een letterlijke backslash wilt matchen, heb je 4 backslashes nodig.
Ok dat is duidelijk bedankt :)
Dat zou kunnen, maar dat vind ik tegenwoordig niet zo heel belangrijk meer.
Toch zou ik het wel doen. Het heeft verschillende voordelen. De gebruiker krijgt direct de melding dat het niet klopt en kan het dan snel aanpassen. Anders zou hij even moeten wachten totdat de pagina weer geladen is voordat hij de aanpassing kan doen. Hij ondervindt zo denk ik iets meer gebruiksgemak. Daarnaast scheelt het een rondje langs de server en daardoor bandbreedte en server load (al hoef je je daar als klein gebruiker daar niet erg druk om te maken).

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:41

crisp

Devver

Pixelated

Anoniem: 26306 schreef op zondag 27 maart 2005 @ 11:12:
[...]
Dat zou kunnen, maar dat vind ik tegenwoordig niet zo heel belangrijk meer.
... zolang je maar wel weer het formulier terugtoont aan de gebruiker met de door hem oorspronkelijk ingevulde gegevens ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 17:04

NMe

Quia Ego Sic Dico.

Waarom eigenlijk een regexp alleen om te kijken of er een \ in een string voorkomt? Wat is er mis met strstr() of strpos()?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Mja, of leer een echte taal...

Perl:
1
2
3
if ( $var =~ m[\\] ) {
    # load error page
}
Niets geen gekloot met honderdduizend keer escapen.

Of, zoals al gezegd:
Perl:
1
2
3
if ( index("\\", $var) ) {
    # load error page
}

kan zijn dat "\\" en $var andersom moeten, weet ff de volgorde niet uit mijn hoofd

NOFI natuurlijk :)

[ Voor 8% gewijzigd door muba op 27-03-2005 13:27 . Reden: Foutje verbeterd en NOFI erin gezet ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 17:04

NMe

Quia Ego Sic Dico.

MUBA schreef op zondag 27 maart 2005 @ 13:26:
Mja, of leer een echte taal...

Perl:
1
2
3
if ( $var =~ m[\\] ) {
    # load error page
}
Niets geen gekloot met honderdduizend keer escapen.

Of, zoals al gezegd:
Perl:
1
2
3
if ( index("\\", $var) ) {
    # load error page
}

kan zijn dat "\\" en $var andersom moeten, weet ff de volgorde niet uit mijn hoofd

NOFI natuurlijk :)
Juist, mooie toevoeging. :/ Mits je weet wat je doet kun je in PHP ook doen wat TS wil. Verder slaat het natuurlijk nergens op om Perl een "echte taal" te noemen, en daarmee PHP-devvers te beledigen (omdat dat impliceert dat PHP geen echte taal is), terwijl je niet eens de moeite doet om fatsoenlijke argumenten aan te dragen. I for one vind het wel fijn eigenlijk dat regular expressions in PHP in strings thuishoren, en vind het een nadeel van Perl dat het daar los gebeurt. En dat "honderdduizend keer escapen" valt ook wel mee. Eén keer voor PHP, één keer voor de regexp.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

-NMe- schreef op zondag 27 maart 2005 @ 13:43:
[...]

Juist, mooie toevoeging. :/ Mits je weet wat je doet kun je in PHP ook doen wat TS wil. Verder slaat het natuurlijk nergens op om Perl een "echte taal" te noemen, en daarmee PHP-devvers te beledigen (omdat dat impliceert dat PHP geen echte taal is), terwijl je niet eens de moeite doet om fatsoenlijke argumenten aan te dragen. I for one vind het wel fijn eigenlijk dat regular expressions in PHP in strings thuishoren, en vind het een nadeel van Perl dat het daar los gebeurt. En dat "honderdduizend keer escapen" valt ook wel mee. Eén keer voor PHP, één keer voor de regexp.
Je hebt gelijk. Ik hoopte met de NOFI op het eind het een beetje te relativeren. Ik kan geeneens fatsoenlijk PHP dus ik heb geeneens recht van spreken. In principe is PHP
edit:
is
net zo echt een taal als Perl, Visual Basic, C(++/#), Assembly, Delphi en noem ze allemaal maar op.

En fatsoenlijke argumenten. Nouja, dat sprak voor zich dacht ik zo. Duidelijke, heldere code zonder honderdduizend twee 8) keer te escapen.

PHP behandeld regexps als strings en Perl niet. Ik vind de Perl-manier fijner (voordeel: je typt letterlijk wat je wil, nadeel: beetje vreemd is het wel), jij blijkbaar de PHP manier (voordeel: een string is een string is een string, nadeel: je typt niet letterlijk wat je wil).

Maar ik had allerminst de bedoeling om een holy war te beginnen en ik hoop dan ook dat we allebei als volwassenen kunnen zeggen, "zand erover". Het was meer bedoeld als half-serieus, half-grappig. Stom genoeg komt vooral het serieuze in zo'n geval altijd duidelijker over dan het grappige en dat had ik moeten beseffen toen ik op Verstuur Bericht klikte, maar achteraf is altijd makkelijk praten.

[ Voor 2% gewijzigd door muba op 27-03-2005 14:00 . Reden: Stomme formuleringsfout aangepast ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 17:04

NMe

Quia Ego Sic Dico.

Mijn post was ook zeker niet als start van die heilige oorlog bedoeld, ik wilde alleen jouw post een beetje relativeren door aan te tonen dat het een persoonlijke keuze is, en dat je slechts een mening verkondigde. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 23:23
Je kunt evt ook de \ in hex omzetten als je dat netter vindt:
code:
1
'/[\x5c]+/'

De hexcodes kun je vinden met de bin2hex() functie:
code:
1
echo bin2hex('\\');
Pagina: 1