2016-05-19 5 views
1

Ich habe eine Zeichenfolge wie:Split string (url params string) auf Basis von "&" und ermöglicht & innerhalb des param Wert

Id=bzat4e&Name=Gallery: Blitzer: Algebra & Trigonometry, 4e&Year=2016&Code=bzat4e 

und ich möchte es auf der Grundlage von & aufzuspalten, während es die & Innenwerte.

Grundsätzlich ist es eine Zeichenfolge von URL-Parametern und ich hole den Wert auf der Basis von Schlüssel in meinem JavaScript.

I/P 
var paramList = Id=bzat4e&Name=Gallery: Blitzer: Algebra & Trigonometry, 4e&Year=2016&Code=bzat4e 

O/P 
[Id="bzat4e", Name="Gallery: Blitzer: Algebra & Trigonometry, 4e", Year="2016", Code="bzat4e"] 
+1

Beachten Sie, dass ein 'Literal' & in einem URL-Parameter mit% 26 codiert werden muss. –

+0

Ja ist es, im Grunde ich die Zeichenfolge mit abrufen var paramList = decodeURIComponent (window.location.searchsubstring (1)) –

+0

@ A_01: Wenn Sie die 'window.location' in den Beitrag aufnehmen könnten, wäre es wirklich Hilf uns, dir zu helfen. – AKS

Antwort

2

können Sie split() verwenden Sie es als ein Array zu bekommen

var str = 'Id=bzat4e&Name=Gallery: Blitzer: Algebra & Trigonometry, 4e&Year=2016&Code=bzat4e'; 
 
var res = str.split(/&(?=[^=&]+=)/); 
 
console.log(res);


Um das Array zu einem Objekt Verwendung reduce()

zu konvertieren

var str = 'Id=bzat4e&Name=Gallery: Blitzer: Algebra & Trigonometry, 4e&Year=2016&Code=bzat4e'; 
 
var res = str.split(/&(?=[^=&]+=)/).reduce(function(a, b) { 
 
    var spl = b.split('='); 
 
    a[spl[0].trim()] = spl[1]; 
 
    return a; 
 
}, {}); 
 
console.log(res);


Für alte Browsercheck polyfill option for reduce() method.


Regex explanation here

Regular expression visualization

+0

Kein glück mann. Es erstellt 2 Schlüssel-Wert-Paar. Gefallen Sie diesen "Namen": "Galerie: Blitzer: Algebra", "Trigonometrie, 4e": undefined, , die ich mag nicht –

+0

@ A_01: aktualisiert –

1

Edit: nicht sicher, warum ich nicht von dieser früher dachte:

var arr = paramList.split(/\b&\b/); 

es unten ausprobieren:

var paramList = "Id=bzat4e&Name=Gallery: Blitzer: Algebra & Trigonometry, 4e&Year=2016&Code=bzat4e"; 
 

 
var arr = paramList.split(/\b&\b/); 
 
var finalArr = []; 
 

 
arr.forEach(function(pair) { 
 
    var values = pair.split('='); 
 
    var key = values[0]; 
 
    var value = values[1]; 
 
    var obj = {}; 
 
    obj[key] = value; 
 
    finalArr.push(obj); 
 
}); 
 

 
console.log(arr); 
 

 
console.log(finalArr);

+0

andernfalls für i/p classId = Sandbox-bzat4e & bltiRequestClassName = Galerie: Blitzer: Algebra & Trigonometrie, 4e & schoolYear = 2016 & bookCode = bzat4e –

+0

@ A_01 Ja, es hat das gleiche Problem, nur ohne die unnötigen zusätzlichen Zeichen. Lassen Sie mich jetzt eine Lösung erstellen. – timolawl

+0

@ A_01 Wenn jede Instanz von '&', die Sie aufteilen möchten, immer zwischen Wortgrenzen liegt, können Sie die Regex einfach in '\ b & \ b' ändern. Siehe meine aktualisierte meine Antwort. – timolawl

1

Die Lösung für Ihr spezielles Eingabestring mit String.split Funktion:

var str = "Id=bzat4e&Name=Gallery: Blitzer: Algebra & Trigonometry, 4e&Year=2016&Code=bzat4e", 
    result = str.split(/(?!\s)[&](?!\s)/); 

// now result contains 4 items 
console.log(result); // ["Id=bzat4e","Name=Gallery: Blitzer: Algebra & Trigonometry, 4e","Year=2016","Code=bzat4e"] 
+0

Ihre Lösung funktioniert gut. Danke, Mann. Auch ich sah einige hat eine Lösung geantwortet wie: Split (/ & (?! \ S) /) aber er entfernte das nicht sicher, aber seine Lösung funktioniert auch –

+0

Ich habe das nicht gesehen. Es funktioniert nicht für dich? Vielleicht testen Sie es auf einer anderen Eingabezeichenfolge? – RomanPerekhrest

+0

@ A_01 Das war ich. Ich wusste nicht, ob deine Lösung auch in Objekte konvertiert werden sollte, also habe ich sie entfernt. Ich stelle es auch mit einer Objektlösung wieder her. – timolawl

1

Sie einen regulären Ausdruck verwenden können, um die Zeichenfolge zu spalten, so etwas wie -

/(?!\s)&(?!\s)/g

Dieser Wille Teilen Sie Ihre Zeichenfolge basierend auf dem Zeichen "&", sofern vorhanden keine Leerzeichen um ihn herum.

Überprüfen Sie RegEx101 für einen einfachen Online-RegEx-Editor.

+1

@ A_01 das '(?! \ S)' vor dem '&' verhindert nicht, dass ein Leerzeichen davor das Match negiert. https://regex101.com/r/wR1tJ4/1, weshalb ich es nicht aufgenommen habe. – timolawl

+0

@Merlin Vielen Dank für die Erklärung auch können Sie bitte wissen, gute Seite/Tutorial, um es zu lernen. Weil ich mich bemühte, korrekte RegEx von den letzten 2 Stunden auf RegEx101 selbst zu schaffen :) –

+1

@ A_01 regular-expressions.info. Wenn das zu viel ist, hat regexr.com eine kleine Referenz, die ich hilfreich fand, als ich anfing, Regex zu lernen. SO hat eine Menge Ressourcen auch auf Regex: http://StackOverflow.com/a/2759417/5812121 http://StackOverflow.com/A/22944075/5812121 – timolawl