2016-07-18 11 views
3

Hintergrund mitNicht in der Lage, die Werte von Javascript zu erhalten benötigt Teilzeichenfolge

ich derzeit WebAPI gebaut haben, die ich verwendet, um eine Sharepoint-Sammlung zu kriechen. Ich bekomme Bilder base64 und alle benötigten Eigenschaften über csom. Ich gebe all diese Werte über meinen Controller an eine word.js App zurück, an der ich gerade arbeite.

Frage

Der String-Wert I bin immer "width=611px;height=262px;". Wie Sie vielleicht sagen können, suche ich nach der Breite und Höhe dieser Zeichenfolge und weise sie einzelnen Variablen zu.

Aktuelle Ansatz

Ich habe dieses Gespräch hat vor über Regex und Teilzeichenfolge und es ist allgemein bekannt, dass mit substring ist effizienter als regulärer Ausdruck. Ich frage mich jedoch, ob in diesem Fall ein Regex-Ausdruck effektiver ist als die Verwendung von Substring.

aktuelle Code

var Widthtest = contentObject.ImageSize[x].replace("width=", '').replace("height=", '').replace("px", '').replace(";", '').trim(); 

aktuelle Code Probleme

  1. Das Codebeispiel geliefert wird, die Werte von Höhe und Breite in einer Zeichenkette kombiniert.
  2. Das Codebeispiel geliefert ist rudimentär und Verwirrung für andere Entwickler

Gewünschtes Ergebnis

Mein Ziel ist es verursachen kann zwei Variablen zu haben, die den Wert der Breite und Höhe getrennt halten . Aus einer Zeichenfolge, die das gleiche Format wie "width=611px;height=262px;"

var height = height.value; 

var width = width.value; 
+0

Du bist besser dran mit einem regex als Teilzeichenfolge. – Ozil

Antwort

1

Eine Option folgt Sie haben, ist regex zu verwenden, erfassen Gruppen für die beiden Werte separat einzustellen. Sie können ...

var re = /width=(\d{1,4})px;height=(\d{1,4})px;/; 

... als Ihre regex. Das Muster geht davon aus, dass sowohl height als auch width zwischen 1 und 4 Stellen lang sind. Die erste Erfassungsgruppe ist der Breitenwert und die zweite ist der Höhenwert.

es nutzen zu können, praktisch und ordnen diese erfassten Werte, wie Sie möchten, können Sie dies tun:

var height = re.exec('width=611px;height=262px;')[2]; //2 for the second capturing group 
var width = re.exec('width=611px;height=262px;')[1]; //1 for the first capturing group 

var testStr = 'width=611px;height=262px;'; 
 
var re = /width=(\d{1,4})px;height=(\d{1,4})px;/; 
 

 
console.log('Width: %d', Number(re.exec(testStr)[1])); 
 
console.log('Height: %d', Number(re.exec(testStr)[2]));

+1

sehr gut beschrieben danke –

2

Der String ist ein festes Format, alles, was Sie wissen müssen ist, die Position des ersten ; - von dem Sie die Werte basierend auf ihrem Offset innerhalb der Zeichenfolge extrahieren können. Persönlich sehe ich keinen Grund, einen regulären Ausdruck zu verwenden.

var pos = str.indexOf(";"); 

var w = str.substr(6, pos - 8); 
var h = str.substr(pos + 8, str.length - pos - 11); 
+0

Dies ist kein sehr guter Ansatz für unbekannte Größen. Sie codieren Positions-Teilstrings basierend auf 3-stelligen Zahlen, aber dies würde für keine andere Länge fehlschlagen. –

+1

Nein, es wird für jede Länge funktionieren. –

+0

var pos = str.indexOf (";"); var w = strstring (6, pos - 2); var h = strstring (pos + 8, str.length-3); –

1

Es hängt teilweise von der Zuverlässigkeit Ihrer Eingabedaten ab. Ein wesentlicher Vorteil eines Regex ist, dass es eine bequeme Möglichkeit bietet, das Format der gesamten Eingabezeichenfolge zu validieren.

Nicht, dass ich unbedingt diesen Ansatz zum besseren Lesbarkeit Bedenken empfehlen, aber man kann es als eine in Javascript mit Destrukturierung Zuordnung Einzeiler tun 1.7+:

[ , width, height ] = (/width=(\d+)px;height=(\d+)px;/.exec(str) || [0,0,0]).map(Number); 

Beachten Sie, dass [0,0,0] ist unser Standard-Ausweich bei eines ungültigen Formats der Eingabezeichenfolge.

Vollständiger Testcode:

var str = "width=611px;height=262px;", 
    width, height; 

[ , width, height ] = (/width=(\d+)px;height=(\d+)px;/.exec(str) || [0,0,0]).map(Number); 

console.log('Width = ' + width); 
console.log('Height = ' + height); 

Ausgang:

Width = 611 
Height = 262 

Alternate Version

Dieses ist mehr 'akademische':

var str = "width=611px;height=262px;", 
    size, width, height; 

if(size = /width=(\d+)px;height=(\d+)px;/.exec(str)) { 
    [ width, height ] = size.slice(1).map(Number); 
} 
else { 
    throw "invalid format"; 
} 

Ohne Regex

Wenn Ihre Eingangsdaten zuverlässig genug ist, und Sie müssen nicht sein Format zu überprüfen, wie etwas, das sollte genauso gut funktionieren:

var str = "width=611px;height=262px;", 
    width, height; 

[ width, height ] = str.split('=').slice(1).map(function(s) { return parseInt(s, 10); });