2009-05-27 17 views
0

Ich habe folgende HTML:Wie mit Javascript und Regex übereinstimmen?

<span id="UnitCost5">$3,079.95 to $3,479.95</span> 

und ich möchte Javascript und Regex verwenden, um alle Zahl zu erhalten, übereinstimmt.

So will ich mein Script-Funktion zurückzukehren: 3,079.95 UND 3,479.95

Beachten Sie den Text unterschiedlich sein kann, so muss ich die Lösung so allgemein wie posible, kann es so sein wird:

<span id="UnitCost5">$3,079.95 And Price $3,479.95</span> 

Antwort

3

Alle Zahlen würden angepasst werden durch:

\.?\d[\d.,]* 

Dies die Zahlen vorausgesetzt, dass Sie sucht mit einem Dezimalpunkt beginnen kann. Wenn sie nicht, würde dies funktionieren (und vielleicht produzieren weniger False Positives):

\d[\d.,]* 

Beachten Sie, dass verschiedene lokale Gewohnheiten in Zahlenformatierung existieren.

Ich nehme an, dass Sie geeignete Mittel verwenden, um den Textwert der HTML-Knoten zu erhalten, die Sie verarbeiten möchten, und dass HTML-Parsing nicht Teil der Übung ist.

+0

ich schrieb es var Preise = myElement.innerHTML.match (/ \.? \ d [\ d.,] */g); und/g, um alle Preise nicht nur die erste zu erhalten. –

+0

Ich schlage vor, dass Sie innerText (oder textContent) verwenden, es sei denn, Sie sind absolut sicher, dass innerHTML keinen HTML-Code enthalten kann. Wenn Sie eine JavaScript-Bibliothek installiert haben, können Sie damit den Textinhalt browserunabhängig abrufen. – Tomalak

0

Eine sehr einfache Lösung ist die folgende. Beachten Sie, dass auch einige ungültige Zahlenfolgen wie $..44,.777 übereinstimmen.

\$[0-9,.]+ 
0
(function() { 
    var reg = /\$([\d\.,]+)\s[\w\W]+\s\$([\d\.,]+)$/; 


    // this function used to clean inner html 
    function trim(str) { 
     var str = str.replace(/^\s\s*/, ''), 
      ws = /\s/, 
      i = str.length; 
     while (ws.test(str.charAt(--i))); 
     return str.slice(0, i + 1); 
    } 

    function getNumbersFromElement(elementId) { 
     var el = document.getElementById(elementId), 
      text = trim(el.innerHTML), 
      firstPrice, 
      secondPrice, 
      result; 

     result = reg.exec(text); 

     if (result[1] && result[2]) { 
      // inside this block we have valid prices 
      firstPrice = result[1]; 
      secondPrice = result[2]; 
      // do whatever you need 
      return firstPrice + ' AND ' + secondPrice; 
     } else { 
      return null; // otherwise 
     } 
    } 
    // usage: 
    getNumbersFromElement('UnitCost5'); 
})(); 
1

Sie wollen nicht alle Zahlen zu erfassen, sonst laufen Sie 5 in der ID bekommen würde, auch. Ich würde vermuten, was Sie suchen Zahlen wie folgt aussehen: $#,###.##

Hier geht der Ausdruck dafür:

/\$[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?/ 
  • \$ Das Dollarzeichen
  • [0-9]{1,3} One bis drei Ziffern
  • (,[0-9]{3})* [Optional]: Digit Drillinge, ein Komma voran
  • (\.[0-9]+)? [Optional]: Noch mehr Zahlen, die durch einen Punkt voraus
0

Im Folgenden wird ein Array aller Preis angeboten werden in der Zeichenfolge gefunden

function getPrices(str) { 
    var reg = /\$([\d,.]+)/g; 
    var prices =[]; 
    var price; 
    while((price = reg.exec(str))!=null) { 
     prices.push(price); 
    } 
    return prices; 
} 

Bearbeiten: Beachten Sie, dass die Regex selbst einige falsche Positive zurückgeben kann.

1
/(?:\d{1,3},)*\d{1,3}(?:\.\d+)?/g; 

Lassen Sie uns brechen t Hut in Teile für Erklärungen:

  • (?: \ d {1,3},) * - Entsprechen alle durch einen Tausendertrenner getrennten Zahlen
  • \ d {1,3} - Stimmen Sie die Zahlen vor dem Dezimalpunkt
  • (?:. \ d +) - passen Sie eine beliebige Anzahl von Dezimalstellen
  • Flag ‚g‘ - Machen Sie eine globale Suche alle Spiele in der Zeichenfolge zu finden

Sie können es wie folgt verwenden:

var regex = /(?:\d{1,3},)*\d{1,3}(?:\.\d+)?/g; 
var numbers = "$3,079.95 And Price $3,479.95".match(regex); 
// numbers[0] = 3,079.95 
// numbers[1] = 3,479.95 
+0

Das würde der Zeichenfolge 1,1,1,1.0 entsprechen – soulmerge

Verwandte Themen