2010-08-12 9 views
5

Grundsätzlich mag ich die gleichen wie here tun, die in Python getan. Ich möchte alle selbst geschlossenen Elemente durch die lange Syntax ersetzen.Schließen offene XML-Tags mit regex

Beispiel

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

wird

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

vollständiges Beispiel:

<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

Beachten Sie, dass http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 die Umkehrung dieser Operation beschreibt. – Borealid

+0

Borealid, ich bin mir dessen bewusst. Kannst du das mit einem Parser beheben? Soweit ich mich erinnere, muss das XML wohlgeformt sein, bevor es mit einem Parser analysiert wird. Genau das muss ich tun. Ich habe Tidy ausprobiert, aber das hat nicht funktioniert und das Projekt wird nicht mehr gepflegt. Dies ist eine kleine HTML-Ausgabe, die einfach eine Reihe von Javascript-Includes und das Objekt Embed Tag (Flash) haben wird. – user3111525

Antwort

1

Ok Jungs. Ich habe einen Workaround gefunden. Ich hakte die Ausgabemethode zu XML, woher dieser HTML kommt und die XSLT-Engine kümmert sich darum, diese offenen Tags für mich zu schließen. Danke für die Antworten, aber wenn Sie eine Lösung für das Problem haben, lassen Sie Ihre Antwort und ich werde es als eine Antwort markieren. Dies könnte für andere nützlich sein.

1

Damit kann ein Tag (Code in JavaScript) zu ersetzen.

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

Das gleiche, in Java.

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

Opera, ich brauche das in Java. – user3111525

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

und das wird richtig Tags verarbeiten, die nicht beendet werden, wie <hr> und <img>

+0

Es hat Scott nicht funktioniert. Ich habe die Frage mit einem Beispiel bearbeitet. – user3111525

+0

Hmm .. scheint für mich zu arbeiten, obwohl dein Beispiel nichts hat, das dem regexp entspricht, das ich zur Verfügung stellte (dh, es hat keine selbstgeschlossenen Elemente). Ich habe den Modifikator so angepasst, dass er mit mehrzeiliger Eingabe besser funktioniert - das könnte helfen ... –