2010-08-12 10 views
5

Básicamente quiero hacer lo mismo que here que se hace en Python. Me gustaría reemplazar todos los elementos autobloqueados a la sintaxis larga.Cerrando las etiquetas XML abiertas con regex

Ejemplo

<iframe src="http://example.com/thing"/> 

convierte

<iframe src="http://example.com/thing"></iframe> 

ejemplo completo:

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link rel="stylesheet" type="text/css" href="/sample.css"> 
    <title></title> 
    <script type="text/javascript" src="/swfobject.js"> 
       //void 
      </script> 
    <script type="text/javascript" language="JavaScript" src="/generate.js"> 
//void 
    </script> 
    <script type="text/javascript" language="JavaScript" src="/prototype.js"> 
//void 
    </script> 
</head> 
<body id="mediaPlayer" style="margin:0;padding:0;"> 
<script type="text/javascript"> 
           swfobject.registerObject('id_G12564763');  


       function getFlashObject() { 
         var object; 
         if (navigator.appName == 'Microsoft Internet Explorer' || navigator.userAgent.indexOf("Chrome")!=-1) 
         { 
           object = document.getElementById('id_G12564763'); 
         } 
         else 
         { 
           object = document['flash_id_G12564763']; 
         } 
         return object; 
       } 

     </script> 
</body> 
</html> 
+0

Tenga en cuenta que http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 describe el inverso de esta operación. – Borealid

+0

Borealid, soy consciente de eso. ¿Sabes cómo solucionar esto con un analizador? Por lo que recuerdo, el XML debe estar bien formado antes de analizarlo con un analizador. Eso es exactamente lo que necesito hacer. He intentado con Tidy, pero eso no funcionó y el proyecto ya no se mantiene. Esta es una pequeña salida html que simplemente tendrá una serie de javascript includes y la etiqueta de inserción de objetos (flash). – user3111525

Respuesta

1

Ok chicos. Encontré una solución. Enganché el método de salida a xml de donde proviene este html y el motor XSLT se encarga de cerrar esas etiquetas abiertas para mí. Gracias por las respuestas, pero si tiene una solución para el problema, deje su respuesta y la marcaré como respuesta. Esto podría ser útil para otros.

1

Esto puede ser usado para reemplazar una etiqueta (código en javascript).

var becomes = "<iframe src='http://example.com/thing'/>".replace(/<(\w*) (.*)\//,'<$1 $2></$1') 

El mismo, en Java.

String becomes = "<iframe src=\"http://example.com/thing\"/>".replaceFirst("<(\\w*) (.*)\\/", "<$1 $2></$1"); 
+0

Topera, necesito esto en Java. – user3111525

1
String resultHtml = inputHtml.replaceAll("(?six)<(\\w+)([^<]*?)/>", "<$1$2></$1>"); 

y esto va a manejar adecuadamente las etiquetas que no están terminados como <hr> y <img>

+0

No funcionó Scott. Edité la pregunta con una muestra. – user3111525

+0

Hmm .. parece funcionar para mí aunque su ejemplo no tiene nada que coincida con la expresión regular que proporcioné (es decir, no tiene elementos autobloqueables). Ajusté el modificador para que funcione más correctamente con la entrada de varias líneas, eso podría ayudar ... –

Cuestiones relacionadas