Je suis très nouveau sur regex et je ne sais pas comment arracher un morceau de test à partir d'une très grande chaîne en utilisant regex.

Supposons que la chaîne est la suivante: FYI: Cette chaîne serait générée en tirant dynamiquement différents éléments de la base de données et du dom. Je n'ai pas beaucoup de contrôle sur la façon dont il est créé.

Lorem ipsum dolor assis amet, élite adipisice consectetur. Voluptas architecto dicta amet cumque, atque, labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similic porro quam necessitatibus nobis velit debitis. <span itemprop="itemNum">56789</span> labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similic porro quam necessitatibus nobis velit debitis.

J'ai besoin d'obtenir le texte à l'intérieur de la plage qui a un itemprop intitulé itemNum.

J'ai essayé mais cela n'a pas fonctionné pour moi:

/\b(itemprop=\"sku\"")\b/g

Au final, je n'aurais que 56789 dans une variable.

Merci d'avance à tous.

0
Sergio 26 janv. 2019 à 20:20

4 réponses

Meilleure réponse

Une approche pour atteindre l'objectif d'obtenir la valeur si vous n'avez pas nécessairement à utiliser l'expression régulière serait d'utiliser DOMParser pour d'abord analyser la chaîne, puis d'obtenir l'élément en utilisant par exemple querySelect:

const str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptas architecto dicta amet cumque, atque, labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis. <span itemprop="itemNum">56789</span> labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis.';

const parser = new DOMParser();
const doc = parser.parseFromString(str, "text/html");
console.log(doc.querySelector('span[itemprop="itemNum"]').innerHTML)
4
Mathias W 26 janv. 2019 à 22:06

En utilisant regex lookbehind pour itemprop="itemNum"> et lookahead pour </, il vous suffit de capturer ce qui se trouve entre les deux.

const data = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptas architecto dicta amet cumque, atque, labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis. <span itemprop="itemNum">56789</span> labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis.'

const res = data
.match(/(?<=itemprop\="itemNum"\>).+(?=\<\/)/)
//returns an array... get first value
.shift();

console.log(res);
-1
kemicofa ghost 26 janv. 2019 à 17:36

Basé sur https://stackoverflow.com/a/14210948/3999647 vient de mettre à jour l'expression régulière et l'entrée

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptas architecto dicta amet cumque, atque, labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis. <span itemprop="itemNum">56789</span> labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis.';
var myRegEx = /(<span itemprop="\w+">)(\d+)(<\/span>)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 2);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);
1
mexanich 26 janv. 2019 à 17:32

Une solution probable.

let str = `Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptas architecto dicta amet cumque, atque, labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis. <span itemprop="itemNum">56789</span> labore eos nobis earum fuga tempore officiis excepturi rerum placeat. Perferendis, earum officiis veniam dicta eius aliquid, similique porro quam necessitatibus nobis velit debitis.`

let op = str.match(/<[^>]+>([^<]+)<\/[^>]+>/g).map(e=>e.replace(/.*?>(.*)<.*/, "$1"))

console.log(op)
0
Code Maniac 26 janv. 2019 à 17:40