He escrito un sistema de gestión de contenido que utiliza una expresión regular del lado del servidor para escapar símbolos en la respuesta de la página justo antes de que se envíe al navegador del cliente. La expresión regular es consciente de los signos y signos que ya se han escapado o son parte de una entidad HTML. Por ejemplo, los siguientes:Expresión regular para escaparse símbolos HTML respetando CDATA
a & b, c & d, © 2009
se cambia a esto:
a & b, c & d, © 2009
(Sólo se modifica el primer &
.) Aquí es la expresión regular, que fue tomada y modificada a partir de un ayudante Rieles:
html.gsub(/&(?!([a-zA-Z][a-zA-Z0-9]*|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }
Si bien esto funciona muy bien, tiene un problema. La expresión regular no tiene conocimiento de ningún <![CDATA[
o ]]>
que pueda estar rodeando a los signos y símbolos sin guardar. Esto es necesario para que el JavaScript incrustado permanezca intacto. Por ejemplo, esto:
<script type="text/javascript">
// <![CDATA[
if (a && b) doSomething();
// ]]>
</script>
Sentimos prestados como esto:
<script type="text/javascript">
// <![CDATA[
if (a && b) doSomething();
// ]]>
</script>
que por supuesto los motores de JavaScript no entienden.
Mi pregunta es esta: ¿Hay alguna forma de modificar la expresión regular para que haga exactamente lo mismo que ahora, con la excepción de que deja intacto el texto dentro de una sección CDATA?
Dado que la expresión regular no es tan simple para empezar, esta pregunta podría ser más fácil de responder: ¿Es posible escribir una expresión regular que cambie todas las letras en un período excepto esas letras entre '<
' y '>
'? Por ejemplo, uno que cambiaría "some <words> are < safe! >"
en ".... <words> ... < safe! >"
?
Me sorprendería si esto pudiera resolverse usando expresiones regulares solamente, entonces estoy más ansioso de ver a alguien responder esta pregunta :-) –
¿Cómo mostraría un usuario la cadena actual '&' si quisieran ? (por ejemplo, en una muestra de HTML) – orip