En mi aplicación Angular, estoy usando un servicio de traducción que admite la definición de transpiladores personalizados. El transpilador recibe las traducciones entrantes según el contenido de los archivos de traducción. Algunas son traducciones puras y también puede pasar objetos a traducciones (por ejemplo, la label.profile.greeting traducción etiqueta.perfil.saludo):
{ "label.startpage.welcome": "Welcome!", "label.startpage.info": "This website is awesome. Hope you like it.", "label.profile.greeting": "Hi, {{username}}." }Cuando el servicio intenta traducir, recorre todas las palabras dentro de una traducción y envía esa palabra al transpilador. Luego, el transpilador intenta determinar si se trata de una traducción simple o de un objeto que debe inyectarse en la traducción.
Sin embargo, mi transpilador tiene la capacidad de inyectar traducciones en otras traducciones:
{ "label.favourite": "My favourite fruit is", "label.favourite.banana": "{{label.favourite}} banana!", "label.favourite.pineapple": "{{label.favourite}} pineapple!" }He escrito esta simple función de flecha que usa mi transpilador para determinar si la traducción entrante es una clave de traducción o no:
const isTranslationKey = (value: string): boolean => /(\w+(?:\.\w+)+)/.test(value);Y funciona. Aunque, esta expresión regular tiene un alto riesgo de seguridad debido a la sensibilidad a la seguridad de las expresiones regulares, según SonarQube . Supongo que se trata de la longitud de la cadena que puede ser la causa de futuras fallas, ya que no hay un límite máximo para la cadena. Y he intentado cambiar la expresión regular a algo similar, pero no puedo juzgar si encaja mejor o no:
/^([A-Za-z]{1,10})+(\.([A-Za-z]{1,10})).{1,40}$/Necesito algo de experiencia en este asunto. ¡Gracias por adelantado! :)
La expresión regular final que puede usar puede ser cualquiera de las dos, dependiendo de si necesita admitir todas las letras Unicode o no:
/^(?=.{3,60}$)[az]+(?:\.[az]+)+$/i /^(?=.{3,60}$)\p{L}+(?:\.\p{L}+)+$/uTenga en cuenta que la segunda expresión regular es compatible con ECMAScript 2018 y, antes de usarla, asegúrese de que su entorno de JavaScript la admita.
Detalles :
^ - comienzo de la cadena(?=.{3,60}$) : una búsqueda anticipada positiva que requiere de tres a sesenta caracteres distintos de los caracteres de salto de línea seguidos de la posición del final de la cadena inmediatamente a la derecha de la ubicación actual[az]+ - una o más letras ASCII (cualquier letra Unicode si usa \p{L} o \p{Alphabetic} )(?:\.[az]+)+ - una o más repeticiones de . y una o más letras ASCII (cualquier letra Unicode si usa \p{L} / \p{Alphabetic} )$ - final de la cadena.