Estoy trabajando en un proyecto en el que trabajo con la función regex.
Aquí está mi código en jsFiddle
y el HTML está aquí
<div class="post-body"> <a href='/'>color=(green) title=(Hello World) caption=(Hello City 2) post=(New)</a> </div>y js está aquí
$(".post-body").each(function() { var e = $(this), t = e.find("a").text(); if (t) { var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/); if (a) { var s = a[1]; 0 != s && e.find("a").text(s), 0 != i && e.find("a").text(i) } } });Este código funciona bien, pero cuando pongo color y publico valores, el código deja de funcionar.
No sé por qué no se muestran todos los valores como My World Hello City 2 New ?
A continuación, cuando traté de poner valores, el código no funciona, también quiero que haya opciones para que podamos usar un valor o todos los valores, como solo el uso de dos valores, título y título en este caso, o nosotros puede usar todos los valores como color=(green) title=(Hello World) caption=(Hello City 2) post=(New)
$(".post-body").each(function() { var e = $(this), t = e.find("a").text(); if (t) { var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)\s+post=\(([^)]*)\)\s+color=\(([^)]*)\)\s+content=\(([^)]*)\)\s+size=\(([^)]*)\)/); if (a) { var s = a[1], i = a[2]; m = a[3]; n = a[4]; z = a[5]; y = a[6]; 0 != s && e.find("a").text(s), 0 != i && e.find("a").text(i), 0 != m && e.find("a").text(m), 0 != n && e.find("a").text(n), 0 != z && e.find("a").text(z), 0 != y && e.find("a").text(y) } } });En la investigación, encontré un código creado por alguien que funciona bien, tal vez sea útil para solucionar mi problema
Pero estoy tratando de crear mi propio código genuino pero no funciona. Espero aquí conseguir alguna solución. ¡Cualquier tipo de ayuda es muy apreciada!
Puede usar esta expresión regular para que coincida con todos los campos existentes en su sintaxis como esta /(?:([a-zA-Z]{3,})+=\(([^)]*)\))/g y use matchAll para colocarlos todos en una matriz y recorra la matriz de esta manera si desea mostrar los resultados en alguna parte:
$(".post-body").each(function() { var e = $(this), t = e.find("a").text(); if (t) { var a = [...t.matchAll(/(?:([a-zA-Z]{3,})+=\(([^)]*)\))/g)]; if (a) { a.map(function(item, key){ console.log(item) let k = item[1]; let v = item[2]; $("#results").append(`<span>${v}</span>`); }); } } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="post-body"> <a href='/'>color=(green) title=(Hello World) caption=(Hello City 2) post=(New) title=(Hello World 3)</a> </div> <br /> <div id="results"> </div>Wow, ¡fue un proceso difícil! Presencié cuando @freedomn-m trató de adivinar cuáles eran tus intenciones y la forma en que pasó mucho tiempo escribiendo una respuesta y explicándotela. Todo este doloroso asunto podría haberse evitado si hubiera proporcionado un claro ejemplo mínimo reproducible . Los fragmentos externos como el de jsfiddle son de poca ayuda aquí. Tampoco funcionarán razonablemente en pantallas más pequeñas (como en los teléfonos inteligentes) y a muchos usuarios de SO les gusta responder preguntas en estos dispositivos.
¡Felicitaciones y "+1" a @JoseLora por adivinar lo que querías!
Al final, todo el guión se puede acortar esencialmente en una sola línea (para una mejor legibilidad, lo divido en cuatro líneas aquí):
document.getElementById("result").textContent= [...document.querySelector(".post-body a") .textContent.matchAll(/([a-zA-Z]{2,})\s*=\s*\(([^)]*)\)/g)] .map(e=>e[2]).join(" - "); <div class="post-body"> <a href='/'>color=(green) title=(Hello World) caption=(Hello City 2) post=(New)</a> </div> <div id="result"></div> También cambié un poco la expresión regular (eliminé un grupo superfluo que no captura y agregué \s* antes y después de = para que sea más tolerante en caso de que haya espacios en blanco que deban ignorarse.