ugrás a tartalomhoz

RegExpes móka Jsben

therest · 2011. Május. 26. (Cs), 11.30
Nem nagyon találtam olyan fórumot, ahova ez illene, mivel JS-ben kell tető alá hoznom, ezért került ide.

Egy keresőmező tartalmát kéne minél intelligensebben coma-separated formára hozni. Persze a userek fognak írni mindent ami szem szájnak ingere, ezért fontos, hogy jól kezeljem le az inputot.

Ki kéne szűrni a szóközöket(úgy általánosságban a whitespace karaktereket),a nem karakteres, nem numerikus karaktereket('"+!%//=). A user persze össze vissza variálhatja az egyes karakterek sorrendjét, tehát ", " és " ," vagy az eddig említett elemek tetszőleges kombóját betolhatja.

Például egy ilyen inputból: "alma & körte, piros ,sárga!"
Egy ilyet kéne előállítani: "alma,körte,piros,sárga"

Több lépcsőből én is meg tudom oldani, a nem kívánt karaktereket, mind vesszőre cserélem, aztán a több vesszőből álló sorozatokat egyetlen vesszőre cserélem.

Nagyon érdekelne, hogy létezik-e olyan reguláris kifejezés, ami a fentieket egy lépésben lekezeli. Ha valakinek megy ez kisujjból, az megoszthatná velem. Kösz!
 
1

Több lépcsőből én is meg

kuka · 2011. Május. 26. (Cs), 11.53
Több lépcsőből én is meg tudom oldani, a nem kívánt karaktereket, mind vesszőre cserélem, aztán a több vesszőből álló sorozatokat egyetlen vesszőre cserélem.
Az fölösleges, mivel a reguláris kifejezések alapértelmezetten úgyis mohóak. Ezt a részt sztring.replace(/\W+/g,',') elméletileg megoldaná. Amit mégis külön kellene alakítgatni, azok a karakterlánc végein levő nem-szókarakterek volnának.

Én inkább azon agyalnék, hogy hogyan lehetne az ékezetes betűket szókarakterként kezelni. Édes anyanyelvünk esetében a sztring.replace(/[^a-z0-9áéíóöőúüű]+/ig,',') elegendő, de ha más nyelv(ek)et is támogatni akarsz, ez a kivétel sorolgatás már tarthatatlanná válik. A fordítottja, hogy a nem-szókaraktereket sorolod fel, szintén a végtelenségig ragozható, különben bent marad egy póker ♠ ♣ ♥ ♦ vagy még cifrább.
2

split

Poetro · 2011. Május. 26. (Cs), 13.04
function splitTags($text) {
  var items = text.split(/\s*[!-,.\/:-@\[-_{-~]\s*/),  // A lista még finomítható
      result = [],
      i = 0,
      l = items.length;
  for (; i < l; i += 1) if (items[i]) result.push(items[i]);
  return result;
}
splitTags("alma & körte, piros ,sárga!")
["alma", "körte", "piros", "sárga"]
szerk:
Ha érdekel valakit, hogy a fenti kifejezés mire illeszkedik:
var chars = [];
for (var i = 32; i < 127; i+=1) chars.push(i);
String.fromCharCode.apply(String, chars).match(/[!-,.\/:-@\[-_{-~]/g);
["!", """, "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "\", "]", "^", "_", "{", "|", "}", "~"]
3

Köszi a hozzászólásokat.

therest · 2011. Május. 26. (Cs), 14.31
Köszi a hozzászólásokat. Poetro kódját még emésztenem kell, Kuka a mohó viselkedés eszembe sem jutott, köszi, hogy rámutattál.

Van magyar nyelvű cikk a többnyelvű fejlesztésekről? Szimpla honlap elemek szintjénb is, és adatbázis szinten is meg kéne valósítsam. Ötletem van, csak gyanítom, hogy nem a legtisztább mód lenne.
4

A lényeg:

Poetro · 2011. Május. 26. (Cs), 14.58
Széttöröm a szöveget azokon a helyeken, ahol 0 vagy több whitespace (space, tab, újsor, kocsivissza stb.) karaktert !"#$%&'()*+,./:;<=>?@[\]^_{|}~ karakterek közül valamelyik követ, majd újabb 0 vagy több whitespace. Mivel ez eredményezhet olyan elemeket, amelyek üresek (például 2 darab egymást követő vessző), ezeket kiveszem a listából.
5

var input = 'alma & körte,

Karvaly84 · 2011. Május. 26. (Cs), 17.48

var input = 'alma & körte, piros ,sárga!';
var words = input.match(/[\wöüóúőűáéí]+/gi);
var str   = words.join(',');
Ez nem jó?