2009-05-27 9 views
0

J'ai le code HTML suivant:Comment faire correspondre avec javascript et regex?

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

et je veux utiliser Javascript et Regex pour obtenir tous les numéros correspondant.

donc je veux ma fonction de script pour revenir: 3,079.95 ET 3,479.95

Notez le texte peut être différent si j'ai besoin la solution aussi générique que Posible peut être que ce sera comme ceci:

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

Répondre

3

Tous les numéros seraient jumelés par:

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

Cela suppose les chiffres que vous chercher peut commencer par un point décimal. Si elles ne peuvent pas, cela pourrait fonctionner (et peut-être produire moins de faux positifs):

\d[\d.,]* 

Soyez conscient que les différentes coutumes locales existent en format numérique.

Je suppose que vous utilisez les moyens appropriés pour mettre la main sur la valeur de texte des noeuds HTML que vous souhaitez traiter, et que l'analyse syntaxique HTML ne fait pas partie de l'excercise.

+0

je l'ai écrit prix var = myElement.innerHTML.match (/ \.? \ d [\ d.,] */g); et/g pour obtenir tous les prix, pas seulement le premier. –

+0

Je vous suggère d'utiliser innerText (ou textContent) sauf si vous êtes absolument sûr que innerHTML ne peut contenir aucun code HTML. Si vous disposez d'une bibliothèque JavaScript, vous pouvez l'utiliser pour accéder au navigateur de contenu textuel indépendamment. – Tomalak

0

Une solution très simple est la suivante. Notez qu'il va également correspondre à certaines chaînes de nombres invalides comme $..44,.777.

\$[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

Vous ne voulez pas capturer tous numéros, sinon vous obtiendrez le 5 dans l'ID, aussi. Je suppose, ce que vous recherchez est un nombre qui ressemble à ceci: $#,###.##

va ici l'expression que:

/\$[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?/ 
  • \$ Le signe dollar
  • [0-9]{1,3} One à trois chiffres
  • (,[0-9]{3})* [en option]: chiffres triplés, précédés par une virgule
  • (\.[0-9]+)? [en option]: chiffres encore plus, précédés d'une période
0

Le tableau suivant retourne un tableau de tous les prix trouvés dans la chaîne

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

edit: notez que l'expression régulière elle-même peut renvoyer des faux positifs

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

chapeau en parties pour des explications:

  • (?: \ d {1,3},) * - Faire correspondre les nombres séparés par un séparateur de milliers
  • \ d {1,3} - Faire correspondre les nombres avant la virgule
  • (?:. \ d +) - Faites correspondre un nombre arbitraire de décimales
  • Drapeau « g » - Effectuer une recherche globale pour trouver tous les matches de la chaîne

Vous pouvez l'utiliser comme ceci:

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

Cela correspondrait à la chaîne 1,1,1,1.0 – soulmerge

Questions connexes