2017-09-20 14 views
0

J'ai une chaîne comme ceci:Parse contenu HTML à partir d'une chaîne d'entrée en utilisant javascript/lodash

var inputString = "some sample string with <span data-id='24' data-name='cat'">cat</span> and <span data-id='25' data-name='dog'">dog</span>" 

Ce que je suis en train de faire est d'extraire les données des portées dans un tableau JSON:

var json = [ 
    { 
     id: '24', 
     name: 'cat' 
    }, 
    { 
     id:'25', 
     name: 'dog' 
    } 
]; 

puis dépouilleront hors des travées de la chaîne:

var outputString = "some sample string with cat and dog"; 

Toute idée sur la façon dont je peux le faire en utilisant java plaine script ou lodash? Existe-t-il une fonction qui va extraire tous les segments d'étendue, ou dois-je procéder étape par étape, en recherchant les index des éléments d'étendue en commençant par le premier? Toute aide serait appréciée.

+3

Attribuer la chaîne à la 'innerHTML' d'un fragment de document, utiliser les fonctions DOM pour extraire les éléments. – Barmar

Répondre

2

Vous souhaitez analyser la chaîne en HTML, extrait les attributs de données et d'utiliser textContent pour obtenir le texte

var inputString = "some sample string with <span data-id='24' data-name='cat'>cat</span> and <span data-id='25' data-name='dog'>dog</span>"; 
 

 
var parser = new DOMParser(); 
 
var doc = parser.parseFromString(inputString, "text/html"); 
 
var json = [].slice.call(doc.querySelectorAll('span')).map(function(span) { 
 
    return {id : span.dataset.id, name : span.dataset.name}; 
 
}); 
 

 
var outputString = doc.body.textContent; 
 

 
console.log(json); 
 
console.log('------'); 
 
console.log(outputString);
.as-console-wrapper {max-height: 100%!important; top: 0;}

+0

C'est génial! Savez-vous s'il existe un moyen facile de trouver les indices de début et de fin du mot (ex: chien ou chat)? Où le chien apparaît et où le chat apparaît dans la chaîne (en ignorant les travées). – Prabhu

+0

Bien sûr, quand vous avez la chaîne, vous pouvez utiliser 'indexOf' pour obtenir l'index d'un mot dans une chaîne – adeneo

+0

Hmm ok ... Je me demande simplement comment je pourrais obtenir des index seulement pour les mots dans les travées si .. Et bien s'il y a un autre chien ailleurs dans la chaîne ... – Prabhu

1

L'autre réponse est grande et répond vraiment à la question, mais Je voulais fournir une réponse alternative en utilisant regexp. Je ne suis pas le mieux avec regex, mais c'est ce que je suis venu avec ...

const input = "some sample string with <span data-id='24' data-name='cat'>cat</span> and <span data-id='25' data-name='dog'>dog</span>"; 

const dataReg = new RegExp(/data-(\w+)=[\'|\"](\w+)[\'|\"] data-(\w+)=[\'|\"](\w+)[\'+\"]/g); 

const json = []; 

// get the matches and add them to the json array 
while ((g = dataReg.exec(input)) !== null) { 
    // we only care about matches after idx 1 
    let m = {}; 
    m[g[1]] = g[2]; 
    m[g[3]] = g[4]; 
    json.push(m); 
} 

console.log(json); // [{id: "24", name: "cat"}, {id: "25", name: "dog"}] 

// strip the html 
let safeStr = input.replace(/<(?:.|\n)*?>/gm, ''); 

console.log(safeStr); // some sample string with cat and dog" 

Vous pouvez avoir un aperçu ici: https://jsbin.com/quyufoc/edit?js,console

+0

C'est génial aussi. Avec cette méthode si je voulais aussi trouver l'index de début et de fin de chaque mot (chien et chat) dans la chaîne de sortie, comment pourrais-je faire cela? – Prabhu

+0

Je sais que je pourrais utiliser la fonction indexOf, mais dans le cas où d'autres chiens et chats dans la phrase ne sont pas enveloppés dans la durée, il peut me jeter. – Prabhu

+1

Voulez-vous l'index d'eux dans le safeStr? et votre deuxième commentaire cloue définitivement un problème potentiel ... Je suppose que vous voulez l'index du chien et du chat qui apparaissent dans la balise mais en incluant le décalage des caractères enlevés avant qu'il n'apparaisse? – kyle