[js] vage regexp bug

Pagina: 1
Acties:

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Ik heb de volgende js code:

JavaScript:
1
2
    // [url=xxxx://www.bla.com]BLA[/url] code..
    temp = temp.replace(/\\[url=([a-z]+?:\/\/){1}([a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)\](.*?)\\[\/url\]/gi,"<a href=\"$1$2\" target=\"_blank\">$3</a>");

Als ik nu deze laat uitvoeren werkt het soms wel, en soms niet. Als er veel tekst op dezelfde regel voor of na komt, dan matcht ie niet, anders wel.

met alles op 1 regel parsed ie de regel niet:
code:
1
Cheaters in a g.P server can be reported at our [url=http://url.nl/index.php?page=abuse]reportAbuse&#8482; system[/url]


verdeeld over 2 regels wel:
code:
1
2
Cheaters in a g.P server can be reported
at our reportAbuse&#8482; system .


edit: deze bug doet zich alleen voor bij moz/firefox. IE parsed em wel..
edit2: hmz, na wat testen ben ik erachter gekomen dat ie flipt als er meer dan 128 tekens op de regel staan. Wazig.

[ Voor 27% gewijzigd door Grijze Vos op 14-02-2004 15:53 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Is er geen manier om de RegEx anders te formuleren? Zo snap ik niet
waarom jij:

([a-z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)\]

gebruikt...

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

drm

f0pc0dert

even wat "good practices":
Je hoeft metacharacters (?, *, +) binnen een class niet te escapen, dat scheelt al een hoop leesbaarheid. En zet het koppelteken achter- of vooraan in de class, scheelt weer een backslash.

Verder hoef je ']' niet te escapen als hij niet binnen een character class staat.

Een {1} is nooit nodig; 1 maal voorkomen wordt geimpliceerd als je geen andere repetition aangeeft.

Maak van groups die je niet hoeft te capturen non-captured groups en delen die je niet hoeft te groeperen niet onnodig aparte groups. Je hebt in dit geval maar 2 groups nodig die je allebei moet capturen: de url en de naam

Gebruik tot slot de 'x' modifier om je regex een beetje leesbaar te houden:
code:
1
2
3
4
5
6
7
8
9
10
/
   \\[url=
   (
      [a-z]+?                                # protocol
      :\/\/                            
      [-a-z0-9.,?!%*_#:;~\\&$@\/=+]+         # url
   )]
   (.*?)                                     # link naam
   \\[\/url]
/xgi



Geef eens wat voorbeelden van strings die wel en niet werken? Want ik snap niet zo goed wat er nou wel en niet goed gaat.

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


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Ik zal even een testpagina in elkaar schroeven met wat voorbeeldjes. Dat de regexpen op zich ranzig zijn, zou best kunnen. Ik heb ze ook maar geleend van iemand toen ik nog niet zo bedreven was met PHP, en ze wel nodig had. Nu heb ik die regexpen dus gekopieerd naar mn javascriptje toe.

Maar goed, testpagina-tje komt eraan...

http://gaming.pandemic.nl/test.html
Kijk daar maar. Steeds dezelfde tekst, maar op elke nieuwe regels haal ik wat letters weg. Op een gegeven moment, dan zijn er een X aantal tekens of minder op die regel, en dan werkt mn regexp wel gewoon.
(IE6 doet et wel gewoon goed, maar FireFox bijv. niet)

[ Voor 38% gewijzigd door Grijze Vos op 15-02-2004 16:41 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Jij gebruikt (.*?) ergens in het midden van je regexp, als je dit ([\s\S]*?) gebruikt dan zou het wel moeten werken.

De . staat voor elke karakter, behalve een nieuwe regel. Mozilla volgt dit goed op, maar ie kennelijk niet.
Door [\s\S] te gebruiken match je echt op alle karakters inclusief nieuwe regels.

drm, hoe werkt dat precies met die x modifier?
Ik krijg je bovenstaande code niet aan de praat.

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

drm

f0pc0dert

Ik krijg je bovenstaande code niet aan de praat.
Dat kan wel, want ik heb het gewoon uit de losse pols getikt :P

'x' staat voor extended. Dat betekent dat je je regexp uit kan lijnen omdat whitespace characters (zoals een newline, spatie en tab) genegeerd worden, terwijl die in non-extended mode match-self characters zijn.

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


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

javascript ondersteund enkel de m (multi-line), i (ignore-case) en g (global match) flags ;)

Wat je eigenlijk zou willen is een PCRE-DOT-ALL zoals in PHP (s-flag), maar die is er dus niet...

[ Voor 39% gewijzigd door crisp op 15-02-2004 21:36 ]

Intentionally left blank


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

drm

f0pc0dert

crisp:
javascript ondersteund enkel de m (multi-line), i (ignore-case) en g (global match) flags ;)
He, wat suf. Ik zou zweren dat een 'x' ook ondersteund werd 8)7 Maar je hebt idd gelijk.
Wat je eigenlijk zou willen is een PCRE-DOT-ALL zoals in PHP (s-flag), maar die is er dus niet...
Ach, er is opzich niets op tegen om gewoon een (.|\n)* of evt. (?:.|\n)* ipv een .* neer te zetten :)

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


Verwijderd

Hier hebben ze het erover dat het wel bestaat in javascript, maar dat het niet wordt ondersteund:
http://www.webreference.com/js/column5/modifiers.html

Maar ja, ik heb er voor de rest nergens iets over gevonden, dus het zal wel niet bestaan in javascript.
Het is tenslotte moeilijker iets te vinden over iets wat niet bestaat, dan niets te vinden over iets dat wel bestaat.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Maar goed, terug on-topic aub. Of mijn regfexp wel of niet netjes is doet nu niet ter zake. Hij werkt wel gewoon goed onder IE, en bij moz/ff doet ie het goed als de lengte van de regel maar niet te lang is.

Ik vraag me nu dus af of dit een regexp-parser bug van moz/ff is, of niet.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Zie mijn tweede post terug, daar staat het antwoord. Ipv (.*?) --> ([\s\S]*?)
(of die van drm)

Dit is dus een bug in ie, waardoor het daar wel goed in werkt. In ie worden line breaks kennelijk ook gematched met de punt-notatie.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Ik zal het even testen. Alhoewel ik niet denk dat et daarmee te maken heeft, want er staat geen linebreak in...

What the hell. Martijn, je bent ge-wel-dig.. Kun je me nog iets meer uitleg geven, want ik sta perplex. Je oplossing werkt dus, maar er staat bij mij nergens een linebreak in ofzo. 8)7 :?

[ Voor 47% gewijzigd door Grijze Vos op 16-02-2004 01:55 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1