replace von html-code
claudia p
- php
einen schönen guten morgen in die runde,
leider bin ich nicht ganz firm in php, bin aber willig dazu zu lernen. deshalb möchte ich mein anliegen mal in diesem forum veröffentlichen.
ich habe also folgendes vor:
eine linksammlung wird mit hilfe von php generiert:
<?php for ($k=1; $k <= 5; $k++) print "<a href="$datei[$k].php">$zahl[$k]</a>"; ?>
dabei werden $datei und $zahl aus einer incl-datei ausgelesen.
nun entsteht im browser eine liste von links (navigation), die durchnummeriert ist (in $zahl stehen die zahlen von 1-5 mit vorangestellter 0, auch das ist sicher mit php zu lösen, dass das von allein entsteht, ist aber nicht so dringend).
nun möchte ich gern die datei, in der man sich gerade befindet unter den nummern besonders hervorheben. dazu dachte ich mir, könnte ich den oben zitierten code mit str_replace abwandeln und ein <span> mit reinbringen, dass die zahl anders formatiert. irgendwie gelingt mir das aber nicht. dabei dachte ich an folgendes:
if ($k == $nummer[$datei]);
str_replace($k, "<span class="thema">$zahl[$k]</span>", $k);
dabei wird obige zahl mit der nummer und dem dateinamen verglichen und wenn diese übereinstimmen, soll eine andere formatierung erfolgen. leider bin ich mir über den ansatz nicht ganz sicher, da auch die linkliste ja erst auf dem server generiert wird und danach müßte erst der austausch vorgenommen werden und dass ja dann wieder auf dem server. ich vermute, dass es etwas komplizierter werden wird.
kann mir jemand bei der bewältigung der aufgabe helfen?
vielen dank schon im voraus
Claudia P.
Hi,
wenn die Liste sowieso schon dynamisch mit PHP erzeugt wird, warum machst Du die Hervorhebung dann nicht auch gleich an dieser, d.h. baust diese in die Schleife ein?
wenn die Liste sowieso schon dynamisch mit PHP erzeugt wird, warum machst Du die Hervorhebung dann nicht auch gleich an dieser, d.h. baust diese in die Schleife ein?
würde ich sicher machen, wenn ich wüßte wie? gib mir doch mal einen hinweis, wie du das meinst - danke
Claudia P.
Deine Erklärung klingt verwirrend. Ich hatte es vorhin wohl falsch verstanden ;)
Was ich an $zahl nicht ganz verstehe: wenn darin wirklich nur jeweils 01, 02, 03, 04 u. 05 steht, wo ist dann der übrige Link-Text? Ich meine, Zahlen allein sind für Besucher doch wenig aussagekräftig. Oder soll das hier nur als Beispiel dienen?
Wenn die Zahlen < 10 sind, kannst Du statt $zahl[$k] auch einfach 0$k schreiben und damit $zahl sparen.
Sinnvoller wäre aber ein richtiger Text, wobei ich dann $zahl[$k] durch $text[$k] ersetzen würde...
Woher weißt Du denn überhaupt, in welcher Datei man sich gerade befindet? Wird das in der URL übergeben und steht in $nummer? Nachdem die Datei erzeugt und an den im Browser geschickt wurde, vergißt PHP normalerweise alle Variablen-Zustände, d.h. wenn Du hier nicht mit Sessions oder Cookies arbeitest. Wenn Du anschließend im Browser HTML auf einen Link klickst, mußt Du daher dem aufzurufenden PHP-Skript irgendwie kenntlich machen (.z.B. in HTML mit datei.php?nummer=1, d.h. URL-Parameter) was wie passieren soll. Dann kannst Du Deine Anforderung z.B. wie folgt umsetzen:
<?php
for ($k=1; $k <= 5; $k++) {
if ($k == $nummer) {
print "<span class="thema">$zahl[$k]</span>";
}
print "<a href="$datei[$k].php">$zahl[$k]</a>";
}
?>
sorry, vor dem zweiten print fehlt else...
1000 dank Danny,
war genau dass, was ich gesucht hab!
Was ich an $zahl nicht ganz verstehe: wenn darin wirklich nur jeweils 01, 02, 03, 04 u. 05 steht, wo ist dann der übrige Link-Text?
der übrige text kommt durch ein mouseover zustande. hier gehts mir wirklich nur um die zahlen.
Wenn die Zahlen < 10 sind, kannst Du statt $zahl[$k] auch einfach 0$k schreiben und damit $zahl sparen.
was mach ich aber bei zahlen größer 10? da muss sicher wieder eine if-else konstruktion rein, da bei zahlen größer 10 ja keine null mehr davor soll. hättest du da evtl. noch einen tip?
Woher weißt Du denn überhaupt, in welcher Datei man sich gerade befindet?
durch $datei = basename ($PHP_SELF,".php");
nochmal vielen dank und wenn du noch einen tip für obiges zahlenproblem hättest ;-)
Claudia P.
Bitteschön!
was mach ich aber bei zahlen größer 10?
Wie Du schon vermutet hast, entweder über if oder mittels sog. ternären Operator (Bedingung ? wenn wahr : wenn falsch). Am Besten vor der dem Print:
$zahl = ($k < 10) ? "0$k" : $k;
und dann wie gewöhnlich mit print "$zahl" ausgeben.
Schönen Tag noch!
Danny
Hello,
$zahl = ($k < 10) ? "0$k" : $k;
oder die Funktion http://de.php.net/manual/de/function.number-format.php benutzen, was aber hier wohl eher zu Performance-Einbußen führen würde.
Oder die Funktion Substring: echo substr("0000".$zahl,-4);
Würde immer z.B. 0001 oder 0234 oder 0000 anzeigen.
Gilt aber das gleiche für die Performance...
Liebe Grüße aus http://www.braunschweig.de
Tom
Gute Idee, wenn es nicht bei zwei Stellen bleiben soll.
hallo Danny,
nochmal ich. hab jetzt folgende konstruktion, die aber wohl nicht ganz korrekt ist. könntest du dein geübtes auge mal drüberschweifen lassen und mir den entscheidenden hinweis geben, wie ich das ganze funktionstüchtig mache? jetzt zeigt es mir nur die zahl 05 an :-(
<?php
for ($k=1; $k <= 5; $k++)
$zahl = ($k < 10) ? "0$k" : $k; {
if ($k == $nummer[$datei]) {
print "<span class="thema">$zahl</span>"; }
else
print "<a href="$datei[$k].php">$zahl</a>"; }
?>
nochmals vielen dank (auch an Tom - aber da du schreibst, dass deine variante zu performance-einbußen führt, werd ich wohl die hier benutzen)
Claudia P.
Hallo Claudia,
die Anweisungen stehen nicht in einem Block, bzw. sind nicht richtig verschachtelt. Wegen der Übersicht ist es besser, die { } in eigene Zeilen zu schreiben, also:
<?php
for ($k=1; $k <= 5; $k++)
{
$zahl = ($k < 10) ? "0$k" : $k;
if ($k == $nummer[$datei])
{
print "<span class="thema">$zahl</span>";
}
else
{
print "<a href="$datei[$k].php">$zahl</a>";
}
}
?>
Die Performace-Einbußen von Tom's Lösung spielen meiner Meinung nach kaum eine Rolle, jedenfalls wenn es nicht um tausende Durchläufe geht. Verwende daher die Lösung, die Dir am ehesten zusagt, bzw. für Dich logischer erscheint.
Gruß
Danny
Hello,
generell werden Links auf dem Client verarbeitet und der Server bekommt davon nichts mit. Außerdem verliert man die Liste auf dem Client, wenn man nicht mit Frames oder neuem Fenster für den Link arbeitet. Wenn man dies tut, stellen die Browser von sich aus schon einen Mechanismus für den aktiven Link mit dem Pseudoformat http://selfhtml.teamone.de/html/verweise/definieren.htm#gestalten
Wenn Du Dir allerdings eine Maschine baut, die aus einer Liste erst den aktiven Link liefert, um ihn dann z.B. in einem Frame auszuliefern, dann kannst Du mit verschiedenen Styles so ähnlich arbeiten. Die "Links" sind dann ja nicht mehr wirklich aktiv, da sie mit der Seite zusammen vom Server neu angefordert wurden. Dann hilft eben das Vergleichen des Listenindex, der angefordert wurde mit dem, der neu ausgeliefert wird und die Auswahl des richtigen Style-Schlüssels.
Liebe Grüße aus http://www.braunschweig.de
Tom
hallo Tom,
mit css und pseudo-formaten kenn ich mich aus. was es jetzt aber mit frames zu tun hat (die ich hier nicht verwende), weiss ich nicht.
am ende soll eben soetwas herauskommen:
linkliste:
link 1
link 2
sie sind hier: link 3
link 4
link 5
also das 'sie sind hier:' wird dann durch andere farbe, etc verwirklicht. nun weiss ich nur nicht, wie ich das mit dem von mir gewählten weg umsetzen kann (am ende sind es mehr als 20 links, deshalb auch der weg über php).
danke
Claudia P.
Hello,
mit css und pseudo-formaten kenn ich mich aus. was es jetzt aber mit frames zu tun hat (die ich hier nicht verwende), weiss ich nicht.
Mmmh, was passiert denn, wen man auf einen "normalen" Link klickt?
Trommelwirbel. Moment bitte, es kommen noch die Gummibärchen!
Und nun Susi, musst Du dich entscheiden. Ach nee, da bring ich was durcheinander.
Ja, jetzt hab ich's: Die angewählte Ressource wird in das aktive Fenster geladen. Ich psotuliere nun mal, dass Du z.B. eine Tabelle übergibst, in deren linke Spalte die aktuelle Linkliste geladen wird und in deren rechter Spalte der Seiteninhalt steht.
Alle geladenen Links sind damit frisch und das Pseudoformat a:active nützt Dir nix. Alle anderen Pseude-Formate funktionieren aber sehr wohl noch. Nur kannst Du sie nicht verwwenden, da das für Dich im Moment wichtigste nicht erkannt wird. Also musst Du
echo "<a ... style="".actual_style($nr)."" ...>
oder "<a ... class="".actual_class($nr)."" ...>
benutzen.
function actual_style()
{
# wenn schon besucht (geht nur mit Sessions)
# wenn aktiv
# wenn neu
# wenn für diesen User daktiviert
# wenn externer Link
# wenn ...
return "style="color:$color; background-color:$bcolor;"";
}
Liebe Grüße aus http://www.braunschweig.de
Tom