[regex] Deel van string uitfilteren in JS

Pagina: 1
Acties:

  • f.heinen
  • Registratie: Februari 2005
  • Laatst online: 06-02 22:23
Beste Tweakers,

Ik ben, ongelogen, misschien ook wel omdat ik weinig van snapte (en nu een beetje meer) :), al meer dan 10 uur bezig om dit voor elkaar te krijgen.

Ik weet inmiddels dat sommige functies waarmee je een regex kunt gebruiken in javascript verschillende resultaten geven in verschillende browsers (bijvoorbeeld de .split functie).


Mijn probleem, ik wil uit een string een stuk filteren. Voorbeeld strings:
[[1]]
[[0|The directory does not exist]]
[[0|noActionError]]
[[0|The directory does not exist|create a temp directory]]
<table width=100%><tr><td>Hier een mooit tekstje</td></tr></table>[[0|The directory does not exist]]
[[1]]<table><tr><td><a href="http://www.gosomewhere.com">Click here.</a></td></tr></table>


Nu wil ik de string tussen [[ en ]] uitfilteren om vervolgens (of tegelijk) het te splitsen op |. Het resultaat moet dus worden dat alles tussen [[ en ]] gescheiden wordt op | en in een array terecht komt.

Voorbeeld:
<table width=100%><tr><td>Hier een mooit tekstje</td></tr></table>[[0|The directory does not exist]]

Gewenst resultaat:
result[0] heeft waarde "0"
result[1] heeft waarde "The directory does not exist"


Ik heb het volgende al geprobeerd (en nog vele dingen meer maar ik noem de bijna resultaten):
var result = http.responseText.split(/\[\(.*?)\]/);

werkt niet in IE6 & IE7, verkeerd gebruik van functie.


var result = http.responseText.split(/\||\[\[|\]\]/);

for (var i = 0; i < result.length; i++) {
if (result == "") {
result.splice(i,1);
}
}

werkt niet omdat de html ervoor en/of erachter er niet uitgefiltert worden.


var result = http.responseText.split(/\[{2}([^|]*?)(?:\|([^|]*?)){0,1}\]{2}/);
werkt niet in IE6 & IE7 en niet in Safari, verkeerd gebruik van functie.

  • user109731
  • Registratie: Maart 2004
  • Niet online
Zoek je niet RegExp.exec ipv split:
JavaScript:
1
2
3
4
var result = /\[\[(.*?)\|(.*?)\]\]/.exec(http.responseText);

alert(result[1]); // 0
alert(result[2]); // The directory does not exist

Split() is volgens mij meer om een string te 'exploden' naar een array :)

[ Voor 58% gewijzigd door user109731 op 16-11-2006 13:20 ]


  • f.heinen
  • Registratie: Februari 2005
  • Laatst online: 06-02 22:23
Damn! |:( 8)7

Deze regex heb ik ook al zo'n 5 keer gebruikt.... alleen icm .split functie, en dat werkt niet.

Bedankt voor deze wijze les!! _/-\o_

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

f.heinen schreef op donderdag 16 november 2006 @ 12:26:
Ik weet inmiddels dat sommige functies waarmee je een regex kunt gebruiken in javascript verschillende resultaten geven in verschillende browsers (bijvoorbeeld de .split functie).
Heb je daar een voorbeeld van? Ik kan mij zo snel geen grote verschillen in regexp implementaties voor de geest halen in recente browsers.

Intentionally left blank


  • f.heinen
  • Registratie: Februari 2005
  • Laatst online: 06-02 22:23
Als je een string split op het eerste karakter dan creeert IE6 & IE7 1 record met alles na het eerste karakter. FF en OP creeren een empty record voor het deel voor het eerste karakter en een record voor het deel na het eerste karakter.

  • user109731
  • Registratie: Maart 2004
  • Niet online
crisp schreef op donderdag 16 november 2006 @ 23:10:
[...]

Heb je daar een voorbeeld van? Ik kan mij zo snel geen grote verschillen in regexp implementaties voor de geest halen in recente browsers.
Hij bedoeld de split() functie die hij geeft in de TS volgens mij. :) Dit doet in IE6/Firefox wat anders:
JavaScript:
1
2
var a = "abcdefghij_abc".split(/a(b)/g);
alert(a.length);

Dit is toch wel een vreemde regexp voor een split, en opzich ook niet vreemd dat browsers hierop verschillen?

Weet iemand wat de gewenste behavior is hiervan? Ik vind die van IE opzich goed te begrijpen (het is een split, die group maakt toch weinig uit?) :)

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Grote prutser schreef op vrijdag 17 november 2006 @ 00:01:
[...]

Hij bedoeld de split() functie die hij geeft in de TS volgens mij. :) Dit doet in IE6/Firefox wat anders:
JavaScript:
1
2
var a = "abcdefghij_abc".split(/a(b)/g);
alert(a.length);

Dit is toch wel een vreemde regexp voor een split, en opzich ook niet vreemd dat browsers hierop verschillen?

Weet iemand wat de gewenste behavior is hiervan? Ik vind die van IE opzich goed te begrijpen (het is een split, die group maakt toch weinig uit?) :)
If separator is a regular expression, any included parenthesis cause submatches to be included in the returned array.
IE-bug dus. Dat een split bij een match op de eerste karakter(s) ook een eerste lege entry in de result-array oplevert is echter discutabel maar volgens mij ook wel correct naar specificatie (en dus doet IE dat ook fout)

[ Voor 12% gewijzigd door crisp op 17-11-2006 01:32 ]

Intentionally left blank


  • f.heinen
  • Registratie: Februari 2005
  • Laatst online: 06-02 22:23
Klopt, met deze regex is het niet verwonderlijk dat de .split functie raar erop reageerd, echter bij een hele simpele regex is het resultaat hetzelfde.

Ik heb de regex van Grote Prutser nog een beetje aangepast. Ik zal hem vanavond even posten ter info. Het werkt zover ik nu kan zien perfect (in alle browsers: IE6/7 FF OP NS SF).
Pagina: 1