# regex, der mit nur html-comments, nicht aber javascript entfernt



## ruutaiokwu (13. Jul 2011)

hallo zusammen,

hat jmd. einen rege der mir NUR html-comments entfernt, nicht aber javascript-sachen wie:


```
<script type="text/javascript">
			<!--

function blabla()
{

}

//-->
```

den hier -> (?s)<!--.*?[^ ]-->  habe ich im netz gefunden, entfernt aber javascript..


grüsse, jan


----------



## RySa (15. Jul 2011)

Und wie soll das gehen, wenn JavaScript-comments die gleiche Syntax wie HTML comments haben ? Oder irre ich mich da ? Wenn die sich unterscheiden, dann sag mir bitte wie, und ich bastel dir die Regex.

EDIT: Ist das nicht zufällig so, dass das was du geschrieben hast, kein JavaScript-Kommentar ist ? Soweit ich jetzt gelesen habe sind sie so zu schreiben 
/* 
kommentar
*/ 

oder einzeilig 

//kommentar

Was du geschrieben hast ist ein HTML-Kommentar


----------



## Gast2 (15. Jul 2011)

Ja das ist nen HTML Kommentar.
Meinst du zufällig so ein Kontrukt?
[XML]<script type="text/javascript">
<![CDATA[
  //content of your Javascript goes here
]]>
</script>[/XML]


----------



## ruutaiokwu (15. Jul 2011)

hallo zusammen,

@RySa: z.b. wenn die sachen mit *//-->* enden, soll die regel nicht gelten...


@EikeB: ja, das wäre eine lösung... statt den javascript innerhalb des script-tags mit <!-- ... //--> zu verwenden... dann würde meine regex-string nicht mehr zutreffen. nur: ist dieses cdata-sache mit xhtml 4 transitional kompatibel?


----------



## Gast2 (15. Jul 2011)

Ja, das ist ist XHTML standard.
Deine vorherige Lösung hingegen nicht, die würde auch ziemlich sicher von jedem modernen Browser als kommentar gewertet werden und der javascript code würde nie ausgeführt werden.


----------



## ruutaiokwu (15. Jul 2011)

@eikeb: nein, hatte nie probleme damit dass der inhalt nicht ausgeführt wurde. weder bei firefox 5 noch bei ie9. 

der abschliessende teil macht es doch aus? -> *//-->*

wenn ich statt *//-->* ein *-->* schreiben würde, dann wäre es doch sicher ein kommentar?

noch ein weitere frage: manche verzichten vollständig auf solche sachen bei js. was ist der unterschied? ist es korrekt, dass dann ein browser das ganze dann als text darstellen würde, falls er kein javascript unterstützt...?


----------



## RySa (20. Jul 2011)

Versuche das hier:

```
public static void main(String args[]){
		String s ="<!--function bla--bla(){} //-->";
		Pattern pattern = Pattern.compile("<!--(.(//){0})*//-->");
		Matcher matcher = pattern.matcher(s);
		while (matcher.find()){
			System.out.println(matcher.group());
		}
		
	}
```


----------



## ice-breaker (20. Jul 2011)

jmar83 hat gesagt.:


> noch ein weitere frage: manche verzichten vollständig auf solche sachen bei js. was ist der unterschied? ist es korrekt, dass dann ein browser das ganze dann als text darstellen würde, falls er kein javascript unterstützt...?



diese Kommentar war nur damals nötig, als JavaScript von Netscape eingeführt wurde, damit andere Browser die kein JS kennen dies nicht als Text darstellen wurde der Kommentar benötigt.
Heute ist dieser überflüssig und wird deshalb komplett weggelassen, es seiden irgendwelche Tutorials bauen wieder auf 20 Jahre altem Wissen auf


----------



## ruutaiokwu (20. Jul 2011)

hallo zusammen,

*@ice-breaker:*


> es seiden irgendwelche Tutorials bauen wieder auf 20 Jahre altem Wissen auf



 interessant, danke für den hinweis! habe das, wenn ich mich nicht täusche, vor jahren bei selfhtml gelesen. seit dem habe ich das immer verwendet...
*
@RySa:* besten dank für das stück code - werde ich morgen testen! 

in aktuellen projekt werde ich sämtliche kommentare in dieser art drinlassen, trotz ice-breaker's hinweis. in zukunft werd ich dann wohl die cdata-lösung verwenden...


----------



## RySa (21. Jul 2011)

Ach du, sorry, das alte Regex ist ja genau um nur Javascript zu entfernen ^^ habe es irgendwie falsch verstanden. Eine Frage habe ich nur noch hierzu. Sind / innerhalb des Kommentars erlaubt ?

Versuche das hier (ich hoffe es funktioniert  ):

```
Pattern pattern = Pattern.compile("(?s)<!--([.[^/]]/?)*(//|/){0}-->");
```


----------



## ruutaiokwu (22. Jul 2011)

hallo rysa,

bin leider noch nicht dazu gekommen...

entfernt werden sollen sachen in der art:



*<!-- ICH BIN EIN KOMMENTAR -->*


nicht aber das innerhalb des javascript-tags:

<script type="text/javascript">
*	<!--

function blabla()
{

}

//-->*
</script>


...also alles, was mit *<!--* anfängt, und mit *-->* aufhört, ausser es hört mit *//-->* auf...


----------



## RySa (22. Jul 2011)

Ja dann probier doch das zweite regex das ich gepostet habe.


----------



## ruutaiokwu (25. Jul 2011)

hallo RySa,

auch das 2. regex funktioniert leider nicht wirklich. (habe vergessen, was dabei passiert ist...)

manchmal muss man halt den pragmatischen weg gehen, wenn eine dermassen triviale sache nach mehr als 1 woche (threaderstelldatum 13.07.2011) immer noch nicht gelöst ist:


```
private static String removeHTMLComments(String content)
    {
        // removes HTML comments
        int startPos = 0;
        final int i = 4;

        for (int cnt = 0; cnt < content.length() - i; cnt++)
        {
            int endPos = 0;

            if (content.substring(cnt, cnt + i).intern() == "<!--")
            {
                startPos = cnt;
            }
            else
            {
                final int j = 3;

                if (content.substring(cnt, cnt + j).intern() == "-->")
                {
                    endPos = cnt;
                    final String str = content.substring(startPos, endPos + j);

                    if (!str.substring(str.length() - i).contains("/"))
                    {
                        content = content.replace(str, "");
                    }
                }
            }
        }

        return content;
    }
```


das ist für mich auch logisch verständlich, im ggs. zu diesem regex-zeugs!
(...und wohl das letzte mal in meinem leben, wo ich FREIWILLIG versuchte regex einzusetzen - stringoperationen mit "normaler" logik sind doch viiiiiiiiiiiel einfacher und verständlicher, nicht?)



trotzdem besten dank!


gruss, jan


----------



## RySa (25. Jul 2011)

Ist auch nicht gerade einfach dein Problem schnell zu lösen, wenn du immer nur jeden zweiten Tag antwortest  ich habe mein Regex an deinem Beispiel getestet und es hat funktioniert (habe es natürlich auch umgeändert zu Testzwecken). Wenn du aber genauer beschreiben könntest warum es nicht funktioniert und was immer bei rauskommt. Oder auch mehr Beispiele gegeben hättest, an denen es getestet werden kann, wäre es sicherlich leichter dein Problem zu lösen. Wenn du aber doch noch daran interessiert sein solltest es mittels Regex zu lösen, sag mir bescheid, mach ich immer wieder gern (nicht, dass ich Regex besonders mag. Man kann die aber immer wieder gebrauchen und es ist einfach eine gute Übung für mich  ).

Gruß


----------



## ruutaiokwu (25. Jul 2011)

hallo rysa,

das war natürlich keine aussage bezügl. geschwindigkeit in diesem forum (will keinesfalls "fordern" - nochmals vielen dank für deine hilfestellung!), eher habe ich mich ab mir selbst und meiner organisation genervt, dass sowas einfaches nach > 1 woche noch nicht erledigt ist. :-( irgendwie habe ich die sache auch vergessen - wenn ich fragen stelle und mir geholfen wird, sollte ich selbstverständlich rechtzeitig antworten...


das 2. regex ergibt bei folgender anwendung eine exception *java.lang.StackOverflowError:*


```
content = content.replaceAll("(?s)<!--([.[^/]]/?)*(//|/){0}-->", "");
```

die anwendung wäre doch richtig -> alles was dem kriterium entspricht, durch einen leeren string ersetzen...?


und: zusätzlich zum kommentare-entfernen kommt noch eine formatierung des source-codes. ("pretty print" während der entwicklung, kompression im produktiv-betrieb) 

wenn man zuerst formatiert, und erst dann kommentare entfernt, dann ist es einfacher: der formatter sorgt nämlich dafür, dass (u.a.) kommentare KEINE returns mehr drinhaben. (hat sich soeben gezeigt) wenn man also nach dem formatieren die kommentare entfernt, muss das regex etwa keine line-breaks berücksichtigen. das macht die sache schon einfacher...

gruss, jan


p.s.: meine funktion ist buggy, hab das schnell was hingepfuscht was nur auf dem 1. blick funktioniert...


----------



## RySa (25. Jul 2011)

So wird das nicht gehen. Habe es eben an meinem Beispiel getestet und es funktioniert auch nicht. Außerdem verursacht bei dir das replaceAll() eine Endlosschleife. Doch mit replace wird das auch nicht funktionieren. Da musst du glaube ich mit Pattern und Matcher arbeiten. Versuche so etwas wie hier:

EDIT: Habe das alte gelöscht weil es hmm... sagen wir mal "nicht so gut" war  Das Problem bei den Regex ist, dass man nicht so einfach eine Zeichenfolge negieren kann. Also habe ich 2 Möglichkeiten für dich. Das 1:

```
public static void main(String[] args) {
		String s ="das ist ()kein Kommentar <!--ein Kommentar 7//+ß135 /nblabla --> das ist auch &%kein Kommentar <!-- ein naechstes Kommentar --> kein :) Kommentar <!-- ein Javascriptkommentar //-->";
		Pattern pattern = Pattern.compile("(?s)<!--.*?-->");
		Matcher matcher = pattern.matcher(s);
		while (matcher.find()){
			if (!matcher.group().matches("(?s)<!--.*?//-->")){
				s = s.replace(matcher.group(),"");
			}
		}
        System.out.println(s);
		
	}
```

Oder das 2. wobei hier die Zeichenfolge // innerhalb des Kommentars nicht erlaubt ist:

```
public static void main(String[] args) {
		String s ="das ist ()kein Kommentar <!--ein Kommentar/ 7+ß135 /nblabla --> das ist auch &%kein Kommentar <!-- ein naechstes Kommentar --> kein :) Kommentar <!-- ein Javascriptkommentar //-->";
		Pattern pattern = Pattern.compile("(?s)<!--((?!//).)*?-->");
		Matcher matcher = pattern.matcher(s);
		while (matcher.find()){
			s = s.replace(matcher.group(),"");
		}
        System.out.println(s);
		
	}
```

Such dir was aus  Wenn die Performance von großer Bedeutung ist und sowieso keine // innerhalb des Kommentars enthalten sind, dann würde ich die 2. Lösung empfehlen.


----------



## ruutaiokwu (26. Jul 2011)

hallo RySa,

super, jetzt hat's geklappt, vielen dank!

- die 1. variante hat zuerst zuviel entfernt, das problem war aber dass in einem js-block *// -->* statt *//-->* stand. (sorry, evtl. war das auch der grund, warum es bereits vorher probleme gegeben hat...?)

- mit der 2. variante war ein *// -->* nie ein problem, habe jetzt trotzdem alles nach *//-->* geändert. 

ich habe mit die 2. variante ausgesucht ;-), scheint einfacher zu sein. die zeichenfolge *//* wird innerhalb eines "normalen" html-kommentars ohnehin nie verwendet, innerhalb von javascript hingegen schon:

*</script>
<!--

function blabla()
{
    // ich bin leer...
}

//-->
</script>*

...aber sowas wird von deinem regex ja schön "in ruhe gelassen"!

nochmals vielen dank!!


gruss, jan


----------

