innerhalb von $_ Text ersetzen
Lars
- perl
hi,
ich moechte eine HTML-Seite auslesen und dann innerhalb eines HTML-Tags etwas aendern.
das auslesen ist kein thema, das anschliessende anzeigen auch nicht, aber moechte eine auslesen/ersetzen routine basteln, die allgemein gueltig ist.
folgender tag:
<input type="text" name="sperre" size="10" maxlength="1" value="$sperre">
so, ich moechte nun innerhalb des o.g. tags das value $sperre ersetzen durch einen wert, den ich aus einer anderen datei lese, und dann halt entsprechend einsetzen moechte.
wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.
das groesste problem liegt darin, das ja die namen fuer die values unterschiedlich lang sind.
kann mir jemand nen denkanstoss geben?
vielen dank bis hierher
bye Lars
Hi,
wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.
dann machst Du vermutlich etwas falsch. Nenn doch mal bitte Deinen funktionierenden sowie Deinen nicht funktionierenden Code.
Cheatah
Hi,
wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.
dann machst Du vermutlich etwas falsch. Nenn doch mal bitte Deinen funktionierenden sowie Deinen nicht funktionierenden Code.
Cheatah
hi,
sub test {
$errormsg = "Fehler beim Lesen der Datei: http://netserver/vote/index.html";
print "Content-type: text/html\n
<html><head>";
open (DATEI, "/usr/local/httpd/htdocs/vote/index.html") &error($errormsg);
while (<DATEI>) {
$test = $_;
print $test;
}
close (DATEI);
exit;
}
wenn ich nun $test = "<input type="text" name="sperre" size="10" maxlength="1" value="$sperre">";
schreibe und ihn dann "ausprinte" ersetzt er mir &sperre korrekt.
so long
lars
Hi,
»» while (<DATEI>) {
$test = $_;
print $test;
das gibt selbstverständlich die Datei so aus, wie sie ist, denn Du veränderst ja nichts. Suchen und Ersetzen geht z.B. mit Hilfe von regulären Ausdrücken, siehe
perldoc perlre
Cheatah
hi ho
meinst du sowas wie:
»» while (<DATEI>) {
s/$sperre/$sperre/e;
$test = $_;
print $test;
?
sicherer (im sinne von -> nur wirklich ersetzen, wenn es an der richtigen stelle steht...) waere natuerlich
s/(<input[^>]+value=")$sperre("[^>]*>)/"$1$sperre$2"/ei;
:-)
e = evaluate
i = case insensitive
$sperre steht in diesem fall als Platzhalter im HTML-Text, das $ ist mit \ maskiert
cua
n.d.p.
Hi,
s/$sperre/$sperre/e;
s!/e!/g! ;-)
Cheatah
hi ho
s/$sperre/$sperre/e;
s!/e!/g! ;-)
huch :-)
hast recht, das /e brauch ich ja gar nicht ...
cua
n.d.p.
hi ho
meinst du sowas wie:
»» while (<DATEI>) {
s/$sperre/$sperre/e;$test = $_;
print $test;?
sicherer (im sinne von -> nur wirklich ersetzen, wenn es an der richtigen stelle steht...) waere natuerlich
s/(<input[^>]+value=")$sperre("[^>]*>)/"$1$sperre$2"/ei;
hi,
so weit so gut,
aber das kann ich ja dann nur immer auf ein projekt mir zuerchtbasteln.
mein gedanke war der, das das allgemein gueltig ist.
doch irgendwie schaffe ich es nicht.
wenn ich den wert fuer $sperre aus der html-datei auslese und ihn ersetze, funzt es ja, aber wie kann ich es machen, das ich eine zahl statt $sperre habe, und die dann nehme, um sie als datensatznummer zu verwenden $daten[meineausgelesenezahl];?
wie bekomme ich nur den inhalt von value="meinezahl" ??
irgendwie bin ich zu bloed dafuer glaube ich.
thx so long
lars
hi ho
meinst du sowas wie:
»» while (<DATEI>) {
s/$sperre/$sperre/e;$test = $_;
print $test;?
sicherer (im sinne von -> nur wirklich ersetzen, wenn es an der richtigen stelle steht...) waere natuerlich
s/(<input[^>]+value=")$sperre("[^>]*>)/"$1$sperre$2"/ei;
sub test {
$errormsg = "Fehler beim Lesen der Datei: index.html";
print "Content-type: text/html\n
<html><head>
";
open (DATEI "index.html") &error($errormsg);
while (<DATEI>) {
$test = $_;
$test =~ s/(value=")1("[^>]*>)/"$1$daten[1]$2"/; # und das
$test =~ s/(value=")2("[^>]*>)/"$1$daten[2]$2"/; # hier will
$test =~ s/(value=")3("[^>]*>)/"$1$daten[3]$2"/; # ich nur 1x tippen muessen
print $test;
}
print "Test: ".$test1;
close (DATEI);
exit;
}
soweit meine routine.
lars
re hi
ich hab zwar nicht ganz verstanden, was du meinst, aber ich vermute mal, du meinst das:-) :
$test =~ s/(value=")(\d+)("[^>]*>)/"$1$daten[$2]$3"/e;
oder halt
$test =~ s/(value=")(\d+)("[^>]*>)/$1$daten[$2]$3/;
das ergebnis ist bei beiden das gleiche, obwohl beide genaugenommen was anderes machen (siehe perldoc:-))
obwohl ich mich in diesem falle nicht so auf zahlen spezialisieren wuerde, kommt allerdings auf den zusammenhang an - ich wuerde dann wohl eher mit hashes arbeiten.
der haken ist naemlich - wenn hinter value keine zahlen stehen, wird auch nichts ersetzt.
cua
n.d.p.
hi,
erst mal danke fuer deine hilfe,
nun zu meinem prob:
ich habe ein script, welches ich per html-oberflaeche konfigurieren moechte.
ich habe aber keine lust, das komplette html-dokument in mein script zu packen. die html-seite erstelle ich bequem mit homesite, da ich sie eventuell ja noch erweitern will.
nun moechte ich diese seite aufrufen, und mein script soll in die felder die entsprechenden werte aus der konfigurationsdatei ausspucken.
nun stehe ich aber halt noch vor nem weiteren problem, ich habe auch radiobuttons in diesem html-document, die muss ich ja auch noch setzen.
wird ne komplizierte geschichte, daher dachte ich mir, ich koennte ne allgemein gueltige regel zum einsetzen finden, die ich in spaeteren projekten noch gebrauchen bzw. benutzen koennte ohne diese wieder mit viel aufwand anzupassen.
ich hoffe ich habe dir das prob genau genug erklaert.
cu
lars
Hallo Lars,
vielleicht suchst Du sowas:
#!/usr/bin/perl -w
$Felder[2] = "blabla";
$Werte[2] = "hurra";
$Size[2] = "20";
$Inhalt = "print <<EOT\n";
open(IN,"formular.html");
$Inhalt .= $_ while(<IN>);
close(IN);
$Inhalt .= "\nEOT\n;\n";
eval($Inhalt);
wenn in der HTML Datei beispielsweise
<input type="text" name="$Felder[2]" value="$Werte[2]" size="$Size[2]">
steht, dann ersetzt das 'eval()' mit die Variablenbezeichnungen mit den Inhalt der realen Variablen und gibt das aus.
es wird dann, nach obigem Beispiel ausgegeben
<input type="text" name="blabla" value="hurra" size="20">
Grüße
Klaus
hi,
danke das du dich meines probs angenommen hast.
ich habe es jetzt auch ne andere art&weise gemacht.
mein configfile sieht so etwa aus:
wert1
wert2
wert3
wert4
wert5
lese alles in @daten
so, meine html tags haben im value-bereich ne nummer (durchnummeriert vom ersten bis zum letzten)
$i = zaehlervariable
ersetze nun mit ~s/$i/$daten[$i]/e; meinen zu ersetzenden text, und fuelle dadurch meine felder aus.
funzt einwandfrei, habe nur noch keine variante fuer radiobuttons gebastelt.
vielleicht nicht die eleganteste variante, aber immerhin funzt sie einwandfrei.
liebe gruesse
lars
so, ich moechte nun innerhalb des o.g. tags das value $sperre ersetzen durch einen wert, den ich aus einer anderen datei lese, und dann halt entsprechend einsetzen moechte.
wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.
Das geht natürlich so einfach nicht. Dann könnte ja irgendwo in einer eingelesenen Datei durch Zufall
irgendeine Zeichenkette stehen, die zufällig gleich ist mit eine Variable in deinem Programm. Das wäre
natürlich nicht praktikabel.
Was du machen mußt, is, einfach ein Suchen/Ersetzen auf die aktuelle Zeile anwenden.
Allerdings weiß ich nicht, ob Perl (direkt) durch eine Variable ersetzen kann (also z.B. s/ErsetzenText/$sperre).
Probier's einfach mal aus. Vielleicht kann ja ein anderer Forumsteilnehmer, der das genauer weiß, noch
etwas dazu sagen.
Tobias
so, ich moechte nun innerhalb des o.g. tags das value $sperre ersetzen durch einen wert, den ich aus einer anderen datei lese, und dann halt entsprechend einsetzen moechte.
wenn ich den text so wie oben in einen string in perl packe, ersetzt er mir das $sperre einwandfrei, lese ich ihn aus, und schreibe dann $_ in die neue html, ersetzt er es nicht, auch wenn ich $_ vorher einem string zu ordne.
Das geht natürlich so einfach nicht. Dann könnte ja irgendwo in einer eingelesenen Datei durch Zufall
irgendeine Zeichenkette stehen, die zufällig gleich ist mit eine Variable in deinem Programm. Das wäre
natürlich nicht praktikabel.
Was du machen mußt, is, einfach ein Suchen/Ersetzen auf die aktuelle Zeile anwenden.
Allerdings weiß ich nicht, ob Perl (direkt) durch eine Variable ersetzen kann (also z.B. s/ErsetzenText/$sperre).
Probier's einfach mal aus. Vielleicht kann ja ein anderer Forumsteilnehmer, der das genauer weiß, noch
etwas dazu sagen.Tobias
hi,
danke fuer die idee, aber habe ich bereits probiert, geht ja nicht da viriablen unterschiedlicher laenge!
bye lars
Hi,
danke fuer die idee, aber habe ich bereits probiert, geht ja nicht da viriablen unterschiedlicher laenge!
Wie Variablen unterschiedlicher Länge?
(was auch immer das heißt - es dürfte Perl nicht stören)
Tobias
Hi,
danke fuer die idee, aber habe ich bereits probiert, geht ja nicht da viriablen unterschiedlicher laenge!
Wie Variablen unterschiedlicher Länge?
(was auch immer das heißt - es dürfte Perl nicht stören)Tobias
hi,
1. variable: $sperre
2. variable: $test
3. variable: $nochnevariable
4. variable: $oderauchnevariablemitdieserlaenge
cu lars
[http://www.lars-witter.de/selfhtmlpics/work.gif]