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

ruutaiokwu

Top Contributor
hallo zusammen,

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

HTML:
<script type="text/javascript">
			<!--

function blabla()
{

}

//-->

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


grüsse, jan
 

RySa

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:
G

Gast2

Gast
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

Top Contributor
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?
 
G

Gast2

Gast
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

Top Contributor
@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

Bekanntes Mitglied
Versuche das hier:
Java:
	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

Top Contributor
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 :D
 

ruutaiokwu

Top Contributor
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

Bekanntes Mitglied
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 :) ):
Java:
Pattern pattern = Pattern.compile("(?s)<!--([.[^/]]/?)*(//|/){0}-->");
 
Zuletzt bearbeitet:

ruutaiokwu

Top Contributor
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...
 

ruutaiokwu

Top Contributor
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:

Java:
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

Bekanntes Mitglied
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

Top Contributor
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:

Java:
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

Bekanntes Mitglied
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:
Java:
	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:
Java:
	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.
 
Zuletzt bearbeitet:

ruutaiokwu

Top Contributor
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Regex-Regel um fehlende Schlusszeichen zu finden Softwareentwicklung 1
H Regex Frage Softwareentwicklung 2
C Regex Problem Softwareentwicklung 1
H [Java]Regex Hilfe Softwareentwicklung 3
TheJavaKid RegEx Problem Softwareentwicklung 2
P Nur ganze Worte ersetzen mit RegEx Softwareentwicklung 2
C Regex-Problem Softwareentwicklung 24
G RegEx Version number Softwareentwicklung 8
M Regex Ausnahmen/Bedingungen Softwareentwicklung 5
H [RegEx] Anführungszeichen finden Softwareentwicklung 2
B Regex-Problem mit replace außerhalb des matching bereichs liegender Zeichenketten Softwareentwicklung 2
A Regex mit Negation Softwareentwicklung 2
V RegEx um zu escapen? Softwareentwicklung 2
TiME-SPLiNTER Banales regEx-Problem Softwareentwicklung 2
B Regex, um Sätze zu erkennen Softwareentwicklung 3
A Verschachteln von REGEX Softwareentwicklung 4
D Regex zur auswertung von SQL Statements Softwareentwicklung 3
S Regex Frage Softwareentwicklung 4
S sonderzeichen mit regex abfragen Softwareentwicklung 2
N Wie testet ihr regex auf korrektheit? Softwareentwicklung 8
m@nu Problem mit einer RegEx Softwareentwicklung 4
S [RegEx] Dateigerecht geschriebene Namen parsen Softwareentwicklung 2
D Teamspeak Java html app Softwareentwicklung 5
V Lohnt sich HTML noch? Softwareentwicklung 64
T PHP, HTML & CSS Koordinatensystem Softwareentwicklung 11
L Parsen einer HTML Seite Softwareentwicklung 3
K Mit "Java" html-Seite entscripten Softwareentwicklung 6
D Daten aus HSQLDB in HTML transferieren? Softwareentwicklung 3
E HTML Designer? Softwareentwicklung 3
T .html immer als iframe Softwareentwicklung 6
I HTML, Textfeld bei Aufruf => alles markieren Softwareentwicklung 2
T Dynamische Werte (HTML, JavaScript) Softwareentwicklung 4
0 HTML iframe Softwareentwicklung 14
T 2 Fragen zu HTML <TABLE> Softwareentwicklung 7
F HTML Hilfe Softwareentwicklung 4
G HTML: scrollen in tabelle Softwareentwicklung 3
byte Aufklappbare Menüs mit HTML/CSS ? Softwareentwicklung 8
J Prüfen ob JavaScript in HTML-Datei verwendet wird Softwareentwicklung 3
H HTML und JSP Softwareentwicklung 2
R Variablen aus C++ Applikation in html-Seite Darstellen Softwareentwicklung 1

Ähnliche Java Themen

Neue Themen


Oben