amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Javascript [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

21.06.2005, 19:44 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Hallo,
ich habe heute versucht mich ein bisschen in JavaScript reinzuarbeiten und zu Testzwecken mal ein Skript erstellt, das einen Text nach c/c++ Schlüssenworten durchsucht und diese mit den neuen [Farben] Tags des Forums ergänzt.
Dabei bin ich auf einige merkwürdige Probleme gestossen:

Ich suche z.B. nach "struct " mit einem Leerzeichen dahinter. Das klappt soweit ganz gut und wörter wie "structure" in Kommentaren werden ignoriert. Wenn ich jetzt aber z.B. "struct " mit 2 Leerzeichen habe, dann wird das nicht gefunden !
Gibt es da Abhilfe ?
Dann suche ich noch eine Funktion mit der ich gezielt Zeichenketten an einer bestimmten Position einfügen kann. Kennt da jemand was ?

Und gibt es eigentlich Amiga Browser die mit Javascript String Objekten klarkommen ? Aweb kanns scheinbar nicht.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 10:24 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Kaesebroetchen:

Wenn ich jetzt aber z.B. "struct " mit 2 Leerzeichen habe, dann wird das nicht gefunden !
Gibt es da Abhilfe ?


Ja - die fehlerhafte Suchmaske gegen eine fehlerfreie Suchmaske ersetzen.

Sorry wenn die Antwort genauso unspezifisch ist wie die Frage. Wenn Du den fraglichen Code-Teil hier posten könntest, wäre sicherlich eine präzisere Antwort möglich...


[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 10:58 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Zitat:
Original von Solar:

Ja - die fehlerhafte Suchmaske gegen eine fehlerfreie Suchmaske ersetzen.

Sorry wenn die Antwort genauso unspezifisch ist wie die Frage. Wenn Du den fraglichen Code-Teil hier posten könntest, wäre sicherlich eine präzisere Antwort möglich...


var c4 = c3.replace(/struct /g,"struct ");
Ich hatte die entsprechende Seite aber auch oben verlinkt .
Das Problem ist, das wenn ich den Suchbegriff ohne Leerzeichen suchen lasse, dann wird z.B. bei der Suche nach int auch intuition verarbeitet. Wenn im Quellcode jetzt mehrere Leerzeichen nach dem int folgen, dann werden diese int's nicht erkannt, obwohl Sie doch eigentlich das Suchkriterium ("int ") erfüllen.
Vielleicht gibt es ja auch eine bessere Methode das zu realisieren ?
Die Suchen/ersetzen Funktionen sind zwar im Prinzip alle gleich, aber vielleicht wirfst du ja doch mal einen Blick auf die ganze Seite.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 11:01 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Das war ja wohl ein Eigentor mit dem Code...
natürlich werden die [fett][/fett] Tags im code vom Forum interpretiert...

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 12:39 Uhr

Gazelle
Posts: 151
Nutzer
@Kaesebroetchen:

Also bei mir geht es:

Input:
code:
int test1;
int  test2;
int   test3;
int    test4;
int     test5;


output:
code:
int test1;
int  test2;
int   test3;
int    test4;
int     test5;


Vielleicht ist es bei dir ein Tabulator und nicht mehrere Leerzeichen?

Falls es mit regexp geht: /int[ \t]+/

[ \t]+ -> mindestens ein oder mehrere Leerzeichen oder Tabulatoren

hth, Bernd

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 12:57 Uhr

Solar
Posts: 3680
Nutzer
Bei mir geht's auch...?!?

(Sorry, hatte den Link nicht gesehen...)

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 13:01 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@Gazelle:
Danke !
Genau das war es.
Kennst du vielleicht noch eine Funktion, mit der ich eine Zeichenkette an einer bestimmten Position einsetzen kann ?
Damit möchte ich dann z.B. "sowas" erreichen.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 13:45 Uhr

Gazelle
Posts: 151
Nutzer
Zitat:
Kennst du vielleicht noch eine Funktion, mit der ich eine Zeichenkette an einer bestimmten Position einsetzen kann ?
Damit möchte ich dann z.B. "sowas" erreichen.


Das verstehe ich jetzt nicht so ganz? Vielleicht sowas:

code:
Suche nach: \(.*\)"\([^"]*\)"\(.*\)
Ersetzen durch: \1\[b\]\[red\]"\2"\[/red\]\[/b\]\3


Wie gesagt, das sind regular expressions. Ich habe keine Ahnung von Javaskript.

Edit: Äh, ich hoffe die Backslash und Klammern stimmen alle :)

Bernd


[ Dieser Beitrag wurde von Gazelle am 22.06.2005 um 13:46 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 14:11 Uhr

Kaesebroetchen
Posts: 643
Nutzer
Zitat:
Original von Gazelle:
Zitat:
Kennst du vielleicht noch eine Funktion, mit der ich eine Zeichenkette an einer bestimmten Position einsetzen kann ?
Damit möchte ich dann z.B. "sowas" erreichen.


Das verstehe ich jetzt nicht so ganz? Vielleicht sowas:

code:
Suche nach: \(.*\)"\([^"]*\)"\(.*\)
Ersetzen durch: \1\[b\]\[red\]"\2"\[/red\]\[/b\]\3



Na ja, ich will mit dem script halt c/c++ code farbig so gestalten, das er hier im Forum etwas lesbarer daherkommt. Deshalb will ich z.B. "Text in Klammern farbig hervorheben". Deshalb suche ich eine Funktion mit der ich gezielt an bestimmten Positionen Zeichenketten einbauen kann.
Auch für das //Kommentar ->Zeilenumbruch Problem suche ich noch eine Lösung.
Zitat:
Wie gesagt, das sind regular expressions. Ich habe keine Ahnung von Javaskript.

Edit: Äh, ich hoffe die Backslash und Klammern stimmen alle :)

Bernd


[ Dieser Beitrag wurde von Gazelle am 22.06.2005 um 13:46 Uhr editiert. ]


Tja, ich weiß nicht genau was dein code machen soll (bei mir macht er nichts), aber hast du vielleicht einen guten Link wo diese "regular expressions" genauer erklärt werden ?

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 16:07 Uhr

Gazelle
Posts: 151
Nutzer
[text gelöscht, siehe unten]

[ Dieser Beitrag wurde von Gazelle am 22.06.2005 um 17:03 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 16:45 Uhr

Gazelle
Posts: 151
Nutzer
@Kaesebroetchen:

Ich weiss jetzt was Du brauchst:

code:
var c26 = c25.replace(/("[^"]*")/g,"{b}{red}$1{/red}{/b}");


und für deine // Kommentare:
code:
var c## = c##.replace(/(\/\/.*)/g,"{green}$1{/green}");


Kurze Erklärung: Man kann im Suchkriterium diejenigen Teile, welche man beim Ersetzen wiederverwenden möchte mit () umschließen. Diese kann man dann mit $1..$9 (also maximal 9) ansprechen.

" -> Zeichen Hochkomma
[^"]* -> Alle Zeichen, aber nicht Hochkomma
" -> Zeichen Hochkomma

Damit findet regex alle Texte, die in Hochkommas eingeschlossen sind. Nachdem ich jetzt den ganzen Teil mittels () eingeklammert habe, kann ich ihn mit $1 beim ersetzen ansprechen.

hth, Bernd

EDIT: Argl, immer diese Klammern -> Ersetze die geschwungenen Klammern einfach durch eckige.


[ Dieser Beitrag wurde von Gazelle am 22.06.2005 um 16:47 Uhr editiert. ]

[ Dieser Beitrag wurde von Gazelle am 22.06.2005 um 17:11 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 23:04 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@Gazelle
Danke !
Das klappt ja richtig gut.
Machst du das eigentlich beruflich ?

Zitat:
Original von Gazelle:

und für deine // Kommentare:
code:
var c## = c##.replace(/(\/\/.*)/g,"{green}$1{/green}");



Und das ".*" steht dafür, das er nach einem Zeilenumbruch sucht ?



[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 23:32 Uhr

Gazelle
Posts: 151
Nutzer
Zitat:
Original von Kaesebroetchen:
Danke !
Das klappt ja richtig gut.
Machst du das eigentlich beruflich ?


Gern geschehen.
Ich bin vom Beruf Programmierer (allerdings Datenbanksysteme unter Unix). Regex sind unter *nix System sehr verbreitet (und eine eigene Wissenschaft für sich :).

Zitat:
Und das ".*" steht dafür, das er nach einem Zeilenumbruch sucht ?

Nein, das macht replace() anscheinend automatisch.

.* steht für beliebig viele Zeichen ähnlich dem #?.

. bedeutet ein beliebiges Zeichen
* bedeutet, dass sich der vorhergehende Ausdruck beliebig oft wiederholen kann.

a* würde also beliebig viele "a"s bedeuten (oder keine)
a+ dagegen mindestens eines oder mehrere

mit [] schränkt man eine Position auf ein Zeichen ein
[0-9]+ würde jede Zahl finden.

und und und.

Dein Code scheint auch ziehmlich Speicherfressend zu sein. Du definierst jedesmal eine neue Variable, Zwei würden reichen.

var c1 = (forminhalt)
var c2 = c1.replace(...)
c1 = c2.replace(...)
c2 = c1.replace(...)
c1 = c2.replace(...) usw.

Vielleicht sogar eine, wenn c1 = c1.replace(...) geht, aber wie gesagt, ich habe mich mit Javascript noch nicht beschäftigt.

[ - Antworten - Zitieren - Direktlink - ]

22.06.2005, 23:39 Uhr

Kaesebroetchen
Posts: 643
Nutzer
[quote]
Original von Gazelle:
Zitat:
Dein Code scheint auch ziehmlich Speicherfressend zu sein. Du definierst jedesmal eine neue Variable, Zwei würden reichen.

var c1 = (forminhalt)
var c2 = c1.replace(...)
c1 = c2.replace(...)
c2 = c1.replace(...)
c1 = c2.replace(...) usw.

Vielleicht sogar eine, wenn c1 = c1.replace(...) geht, aber wie gesagt, ich habe mich mit Javascript noch nicht beschäftigt.


Ja stimmt wahrscheinlich. Da es aber mein erstes Javascript ist, ging es mir erstmal um die Funktion.
Und soviel wird es bei den paar Tausend Zeilen Text schon nicht werden...

[ - Antworten - Zitieren - Direktlink - ]

05.07.2005, 22:43 Uhr

_PAB_
Posts: 3016
Nutzer
Ich habe jetzt mal konkrete Pläne geschmiedet Syntax-Highlighting hier im Forum einzubauen, sodaß man garnicht erst groß konvertieren muß, sondern direkt im [ code ]-Tag die Sprache angibt und dann wird der Code entsprechend dargestellt. Beispiel:
[ code language="C"]...[ /code]
[ code language="PHP"]...[ /code]

Allerdings kann ich noch nicht sagen, ab wann ich mich damit beschäftigen kann, da ich derzeit erstmal einiges anderes zu erledigen habe.

@Kaesebroetchen:
Danke für Dein Skript, welches ich für "C" sicher gut verwenden kann.
Als Inspiration zumindest.
:-)

[ - Antworten - Zitieren - Direktlink - ]

05.07.2005, 23:07 Uhr

Kaesebroetchen
Posts: 643
Nutzer
@_PAB_:
Danke das du dir die Arbeit machst !
Ich bin sicher dass das beim Lesen und Verstehen fremder Quelltexte helfen wird.

Ich glaube dass das Unterscheiden von Programmiersprachen vielleicht gar nicht nötig ist. Ich denke die meisten hier benutzen C/C++ und auch die Schlüsselwörter anderen Sprachen, sind oft identisch.

Hier ein paar Beispiele:

Schlüsselwörter C

Schlüsselwörter C++

Schlüsselwörter Java

Wenn es aber vom Arbeitsaufwand keinen Unterschied macht, ist eine Trennung sicher wünschenswert.

Nochmals danke für deine Bemühungen.
Und wenn ich dich irgendwie unterstützen kann, dann schick mir ne mail!

[ Dieser Beitrag wurde von Kaesebroetchen am 05.07.2005 um 23:08 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.07.2005, 11:07 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Kaesebroetchen:
var c4 = c3.replace(/struct /g,"struct ");
Ich hatte die entsprechende Seite aber auch oben verlinkt .
Das Problem ist, das wenn ich den Suchbegriff ohne Leerzeichen suchen lasse, dann wird z.B. bei der Suche nach int auch intuition verarbeitet. Wenn im Quellcode jetzt mehrere Leerzeichen nach dem int folgen, dann werden diese int's nicht erkannt, obwohl Sie doch eigentlich das Suchkriterium ("int ") erfüllen.
Vielleicht gibt es ja auch eine bessere Methode das zu realisieren ?


Die gibt es. Da Du ja auch Schlüsselworte ersetzen willst, nach denen evtl eine öffnende Klammer oder ein Zeilenumbruch folgt und natürlich auch keine Wörter finden willst, die z.B. auf int enden, benutze folgendes:
code:
\bwort\b

\b ist dabei ein Platzhalter für "Wortgrenze". Zusammen mit der Gazelle gezeigten Rückreferenz kannst Du auch gleich mehrere Schlüsselwörter suchen und ersetzen. Als Wort verwendest Du dann z.B.:
code:
c1 = c2.replace(/\b(if|else|for|while|break|continue)\b/g,
  "[b][blue]$1[/blue][/b]");

Ein einzelner Ersetzungsvorgang ist natürlich auch effizienter als einer pro Schlüsselwort.

Ein bißchen was zu regulären Ausdrücken findest Du bei Selfhtml




mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ Dieser Beitrag wurde von Holger am 06.07.2005 um 11:10 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Javascript [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.