En JavaScript, estoy tratando de hacer coincidir las siguientes muestras para capturar solo src/ para buscar y reemplazar que itera sobre archivos HTML y CSS.
Muestras a juego:
1. url(src/imgs/...) 2. url("src/imgs/...") 3. url('src/imgs/...') 4. <img src="src/imgs/...">Estoy tratando de no repetir en Regex y no quiero múltiples grupos con expresiones casi idénticas.
Creé un grupo sin captura y puedo hacer coincidir 1 y 4, pero no coincide con 2 y 3.
(((?<=url\()(?<=['"])?)|(?<=\<img\ssrc="))src\/No puedo entender cómo capturar los 4 grupos de forma SECA sin cuantificadores opcionales, que no son compatibles con los grupos que no son de captura.
Un Regex menos elegante como el de abajo funcionará.
((?<=url\()|(?<=url\(['"])|(?<=\<img\ssrc="))src\/¿Existe una solución más elegante que usar dos grupos para tener en cuenta las variaciones en las muestras 1 a 3?
Extraer datos de la fuente CSS y HTML con expresiones regulares no parece una buena idea. Hay analizadores especiales para eso. Aunque aquí está el código que puede resultarle útil:
var samples = [ 'url(src/imgs/...)', 'url("src/imgs/...")', 'url(\'src/imgs/...\')', '<img src="src/imgs/...">', '<img src=\'src/imgs/...\'>', '<img src=\'src/imgs/...\' alt=\'\'>', ]; var report = []; var re = new RegExp( '(?:' // prefix is + '(?:url\\()' // 'url(' + '|' // or + '(?:<img\\s+src=)' // '<img src=' + ')' + '([\'"]?)' // followed by an optional quote + '(.*?)' // URL itself + '\\1' // followed by the quote (still optional) + '\s?.*' // 'img' specific optional suffix (other attributes) + '[)>]' // enclosed by a '>' or a ')' symbol ); samples.forEach(function( sample ){ report.push( re.exec( sample ).join("\t\t") ); }) console.log(report.join("\n"));Producción:
url(src/imgs/...) url("src/imgs/...") " src/imgs/... url('src/imgs/...') ' src/imgs/... <img src="src/imgs/..."> " src/imgs/... <img src='src/imgs/...'> ' src/imgs/... <img src='src/imgs/...' alt=''> ' src/imgs/... Tenga en cuenta que esto fallará para las imágenes con src sin comillas como este: <img src=src/imgs/...>