javascript - script - title html attribute
Javascript equivalente de Perl''s / Q... / E o quotemeta() (3)
No hay tal característica incorporada.
En lugar de implementar el suyo propio, le aconsejo que examine la multitud de funciones de escape de expresiones regulares disponibles en Internet.
Esa página propone la siguiente solución (por Colin Snover ):
RegExp.escape = function(text) {
return text.replace(/[-[/]{}()*+?.,//^$|#/s]/g, "//$&");
}
o aconseja utilizar la biblioteca XRegExp .
En las expresiones regulares de Perl, puede rodear una subexpresión con /Q
y /E
para indicar que desea que esa subexpresión coincida como una cadena literal, incluso si hay metacaracteres allí. También tiene la función quotemeta
que inserta exactamente el número correcto de barras invertidas en una cadena, de modo que si posteriormente interpola esa cadena en una expresión regular, se emparejará literalmente, sin importar su contenido.
¿Javascript (como se implementó en los principales navegadores) tiene algún equivalente integrado ? Puedo escribir mi propia bien, pero me gustaría saber si no tengo que preocuparme.
Quotemeta no se ha implementado de forma nativa por lo que sé, pero lo he usado hace unos meses solo para esto:
function quotemeta (str) {
// http://kevin.vanzonneveld.net
// + original by: Paulo Freitas
// * example 1: quotemeta(". + * ? ^ ( $ )");
// * returns 1: ''/. /+ /* /? /^ /( /$ /)''
return (str + '''').replace(/([/.///+/*/?/[/^/]/$/(/)])/g, ''//$1'');
}
También hay un módulo quotemeta npm , que puede usar en node.js o en el navegador. La implementación consiste en citar todos los caracteres que no son palabras, (abreviatura de [^a-zA-Z0-9_]
).
String(str).replace(/(/W)/g, ''//$1'');
Esto funciona porque todos los caracteres que necesitan escapar no son palabras, mientras que los otros caracteres que terminan por escapar son inofensivos. Por ejemplo, aquí el porcentaje de caracteres se escapa, pero aún coincide normalmente en el RegExp, aunque no fue necesario escapar:
if ("Hello%".match(RegExp(String("%").replace(/(/W)/g,''//$1'')))) { console.log("matched!"); }
`` `
Alguien ha bifurcado el módulo de quotemeta
y notó que los parens de captura no son necesarios, por lo que la expresión regular puede simplificarse aún más de esta manera:
String(str).replace(//W/g, ''//$&'');