Cuando uso la función regex para el título y el subtítulo, funciona, pero cuando agrego más etiquetas coincidentes, no funciona
aquí está el código a continuación que funciona bien sin ningún problema
$(".sidebar").each(function() { var e = $(this), t = e.find(".widget").text(); if (t) { var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/); alert(t); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class='sidebar'> <div class='widget'>title=(example1) caption=(example2)</div> </div>Pero el problema es que cuando trato de usar varias etiquetas coincidentes, no funciona como
<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>Intenté usar expresiones regulares como las anteriores para estos valores, pero no funcionó.
También quiero agregar estos ejemplos de texto y el aspecto de Salida es ejemplo 1 ejemplo 2 ejemplo 3 ejemplo 4 ejemplo 5 pero no tengo idea de cómo hacerlo con la función regex
cualquier ayuda o consejo es muy apreciado
En lugar de usar match() , considere usar exec() , que también le permitirá acceder a los grupos de captura. Idealmente, su grupo de captura debería capturar el valor dentro del paréntesis que viene después del carácter = , para que pueda escribir su patrón de expresión regular como tal:
var re = /\w+?=\((.*?)\)/gi; Luego, es simplemente una cuestión de ejecutar un ciclo while para invocar recursivamente el método exec() hasta que no se encuentren más coincidencias:
$(".sidebar").each(function() { var e = $(this); var t = e.find(".widget").text(); if (t) { var result; var results = []; var re = /\w+?=\((.*?)\)/gi; while ((result = re.exec(t)) !== null) { console.log(result[1]); results.push(result[1]); } console.log('Logging all captured values:\n', results); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class='sidebar'> <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div> </div>Aún mejor: ni siquiera necesitas jQuery para esto:
document.querySelectorAll('.sidebar .widget').forEach(el => { const t = el.innerText.trim(); if (t) { let result; const results = []; const re = /\w+?=\((.*?)\)/gi; while ((result = re.exec(t)) !== null) { console.log(result[1]); results.push(result[1]); } console.log('Logging all captured values:\n', results); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class='sidebar'> <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div> </div>Aquí hay un ejemplo de cómo obtener cualquier valor dado este formato:
Empareja cualquier cosa que no sea a
)una o más veces .
Debe ir precedido de\w+=(
y debe ir seguido de)
Mejor explicado en este ejemplo Regex101
$(".sidebar").find(".widget").each(function() { const txt = $.trim($(this).text()); // Get trimmed text if (!txt) return; // Do nothing const matches = txt.match(/(?<=\b\w+=\()[^)]+(?=\))/g)||[]; matches.forEach(m => { console.log(m); }); }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class='sidebar'> <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div> <div class="widget">ola</div> <div class="widget"></div> <div class="widget">The magic happens=(here) :)</div> </div>En tu código, usas alert(t); que es el resultado de t = e.find(".widget").text();
Si usa el resultado de var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/); luego, la expresión regular devolverá una coincidencia para title= y caption= que tienen un valor en un grupo de captura, pero la coincidencia debe estar en ese orden.
Obtendrá una sola coincidencia ya que no hay un indicador /g , y también hay solo 1 ocurrencia en los datos de ejemplo.
Lo que podría hacer es hacer que su expresión sea un poco menos restrictiva y, en lugar de hacer coincidir específicamente el título y la captura, haga coincidir 1 o más caracteres que no sean espacios en blanco que no sean un signo igual.
Utilice el indicador /g para obtener todas las coincidencias en lugar de una única coincidencia.
[^\s=]+=\(([^)]*)\)[^\s=]+ Coincide 1+ veces con cualquier carácter que no sea = o un carácter de espacio en blanco= Coincide literalmente\( Partido (([^)]*) Capture en el grupo 1 caracteres opcionales que no sean ) o use + en lugar de * para 1 o más\) Partido )Una demostración de expresiones regulares para ver los valores de grupo capturados:
$(".sidebar").each(function() { var e = $(this), t = e.find(".widget").text(); if (t) { var a = t.matchAll(/[^\s=]+=\(([^)]*)\)/g); console.log(Array.from(a, m => m[1])); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class='sidebar'> <div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div> </div>