regex problem
Tonda
- javascript
Hallo, ich bin gerade dabei für ein Spiel einen Nachrichtenformatierer zu schreiben, ich habe es auch fast geschafft, so sieht derzeit mein code aus:
<html><head><title>Telegrammformatierer</title>
[code lang=javascript]<script type="text/javascript">
function Titel()
{
var feld = document.getElementById('eingabe').value, oben = /Betreff\s+(.*)\s+Gesprächspartner\s+(\w+)/, titel = oben.exec(feld);
var zwischen = "[b]Betreff:[/b] " + titel[1] + "\n" + "[b]Gesprächspartner:[/b] [player]" + titel[2] + "[/player]";
var unten = /.*\n(.*\s+(?:am\s\d\d\.\d\d\.\d\d|heute)\sum\s\d\d:\d\d\sUhr(?:.|\s)+)\s(?:.|\s)+\n/gi, nachricht = unten.exec(feld);
var fertig = zwischen + nachricht[1];
document.getElementById('ausgabe').value = fertig;
document.getElementById('test').value = nachricht;
}
function leer()
{
if (document.getElementById('name').value == "Trage hier deinen Ingame Nicknamen ein.") {
document.getElementById('name').value = ""
}
}
function füll()
{
if (document.getElementById('name').value == "") {
document.getElementById('name').value = "Trage hier deinen Ingame Nicknamen ein."
}
}
</script>
</head><body>
<form action="">
<textarea name="name" id="name" cols="50" onclick="leer()" onblur="füll()" rows="1">Trage hier deinen Ingame Nicknamen ein.</textarea><br>
<textarea name="eingabe" id="eingabe" cols="50" rows="10"></textarea><br>
<input type="button" value="Ausgabe" onclick="Titel()"><br>
<textarea name="ausgabe" id="ausgabe" cols="50" rows="10"></textarea><br>
<textarea name="test" id="test" cols="50" rows="10"></textarea><br>
</form>
</body></html>[/code]
und das klappt bisher auch ganz gut, d.h. er liest den gesprächspartner und den Betreff aus. Auch erkennt er an einem datum und einer Uhrzeit wann eine neue antwort beginnt (.*\s+(?:am\s\d\d\.\d\d\.\d\d|heute)\sum\s\d\d:\d\d\sUhr(?:.|\s)+)
Mein Problem ist jetzt, dass er bisher noch alles was nach dem namen, dem datum und der uhrzeit kommt im array unter einem namen speichert. Wenn ich es jetzt begrenzen will (also nur bis dahin wo dann die nächste antwort beginnt), und zwar indem ich danach einfach nochmal angebe, dass ein wort (der name) und ein datum und eine Uhrzeit kommen soll.
Jetzt kommt mein Problem, wenn ich dann auf den button zum berechnen klicke, tut es nicht nur nicht, sondern es hängt sich der ganze browser auf, und reagiert nichtmehr. Eigentlich ist der ganze code richtig.
Das ist der Text, den er durchsuchen soll:
Betreff Das ist der Betreff
Gesprächspartner YYYYY
»1« [2] [3]
Tonda am 15.01.09 um 15:24 Uhr
das ist die zweite antwort
YYYYY am 15.01.09 um 15:16 Uhr
das ist die erste antwort
auch wenn ich jetzt nach dem match zum begrenzen des zu speichernden arrays einfach angebe, bis das nächste mal "YYYYY" kommt, hängt er sich auf.
Ich hoffe ihr versteht mein Problem und könnt mir helfen
MfG Tonda
gudn tach!
und das klappt bisher auch ganz gut,
aber vorsicht, es laeuft nur, wenn zufaellig browser-default-character-encoding mit dem der datei uebereinstimmt, der drecksumlaute wegen.
iow: gib das korrekte encoding im head an.
Mein Problem ist jetzt, dass er bisher noch alles was nach dem namen, dem datum und der uhrzeit kommt im array unter einem namen speichert. Wenn ich es jetzt begrenzen will (also nur bis dahin wo dann die nächste antwort beginnt), und zwar indem ich danach einfach nochmal angebe, dass ein wort (der name) und ein datum und eine Uhrzeit kommen soll.
aeh, was? sorry, die beschreibung ist mir zu wirr. was soll genau passieren?
prost
seth
iow: gib das korrekte encoding im head an.
ähm, encoding?
aeh, was? sorry, die beschreibung ist mir zu wirr. was soll genau passieren?
naja, er soll in der nachricht:
Betreff Das ist der Betreff
Gesprächspartner YYYYY
»1« [2] [3]
Tonda am 15.01.09 um 15:24 Uhr
das ist die zweite antwortx
YYYYY am 15.01.09 um 15:16 Uhr
das ist die erste antworty
den betreff und den gesprächspartner raussuchen (das klappt schon)
dann soll er alles von tonda (also im match, dem wort, das vor dem datum steht) bis antwortx (also dem wort, das vor dem wort vor dem datum kommt) im array unter einem namen speichern, dann alles von YYYYY bist antworty unternem andren namen. Bisher hab ichs soweit, dass er mir alles ab Tonda in einen namen im array speichert (weil ich ja angegeben hab: Wort-Datum-Uhrzeit-alles. Um diesesalles am schluss nun zu begrenzen, will ich eigentlich angeben, dass er alles bis zu dem Wort vor YYYYY unter einem namen speichern soll. Aber genau da hängt sich der Browser immer auf, wenn ich das alles (also .*) begrenzen will.
Hoffe du hast es verstanden
MfG Tonda
gudn tach!
iow: gib das korrekte encoding im head an.
ähm, encoding?
na utf8-, latin-I und so, siehe http://de.selfhtml.org/html/kopfdaten/meta.htm#zeichenkodierung.
naja, er soll in der nachricht:
Betreff Das ist der Betreff
Gesprächspartner YYYYY
»1« [2] [3]
Tonda am 15.01.09 um 15:24 Uhr
das ist die zweite antwortx
YYYYY am 15.01.09 um 15:16 Uhr
das ist die erste antwortyden betreff und den gesprächspartner raussuchen (das klappt schon)
dann soll er alles von tonda (also im match, dem wort, das vor dem datum steht) bis antwortx (also dem wort, das vor dem wort vor dem datum kommt) im array unter einem namen speichern, dann alles von YYYYY bist antworty unternem andren namen.
ah, ok. da ist aber schon ein grundsaetzliches problem vorhanden, wenn jemand in einer nachricht sowas schreibt wie "foo am 01.01.01 um 00:00". denn wie erkennst du dann, ob es zur nachricht gehoert oder eine meta-information ist?
angenommen, du wuerdest das noch in den griff bekommen, schlage ich die nutzung von "split" vor:
var nachrichten_re = /(.*\s+(?:am\s\d\d\.\d\d\.\d\d|heute)\sum\s\d\d:\d\d\sUhr\n)/i;
var nachrichten = feld.split(nachrichten_re);
"nachrichten" waere dann ein array mit allen nachrichten und deren urhebern.
prost
seth
Hallo Tonda,
function füll()
^
und das funktioniert?
Gruß, Jürgen