Name in HTML von Klammern
camacho
- html
Hallo!
Trotz langer Suche finde ich nirgendwo den Namen in HTML von den runden Klammern (die ganz normalen, wie diese). Der UNICODE Name ist ( und ), soviel habe ich erfahren können...
Ich hoffe auf der Art ein Problem in einem PHP Script zu umgehen: ich speichere einen Beitrag in eine Text Datei (mangels Datenbankanbindung), aber wenn Klammern oder ausgerechnet Rauten im Beitrag enthalten sind, gibt es später Probleme.
Danke im voraus!
Hallo,
Ich hoffe auf der Art ein Problem in einem PHP Script zu umgehen: ich speichere einen Beitrag in eine Text Datei (mangels Datenbankanbindung), aber wenn Klammern oder ausgerechnet Rauten im Beitrag enthalten sind, gibt es später Probleme.
Die normalen Klammern sind in HTML nicht benannt (die offizielle komplette Liste gibt es unter http://www.w3.org/TR/html401/sgml/entities.html) - Du hast keine Chance. Warum versuchst Du das Problem zu umgehen anstatt es zu lösen? Was passiert denn, wenn Klammern und Rauten vorkommen?
Christian
Die normalen Klammern sind in HTML nicht benannt (die offizielle komplette Liste gibt es unter http://www.w3.org/TR/html401/sgml/entities.html) - Du hast keine Chance.
das habe ich geahnt. Heulheulheul!
Warum versuchst Du das Problem zu umgehen anstatt es zu lösen? Was passiert denn, wenn Klammern und Rauten vorkommen?
Hallo Christian!
Und erstmal Entschuldigung, dass ich mich so langsam zurückgemeldet habe, nachdem du dich gestern so schnell gemeldet hattest.
Ich muss ein Redaktionsystem ohne Datenbankanbindung erstellen. Ich habe es gelöst mit einem Script, der die Beiträge in einer Textdatei speichert
$newfile = fopen($filepath,"w+");
fwrite($newfile,$wholetext);
fclose($newfile);
Die einzelnen Beiträge werden durch "%" getrennt.
Die Unterteile der Beiträge (Titel, Datum, Text...) werden durch "#" getrennt.
Dann lese ich ein Array raus:
$lines = explode("%",$content);
while(list($key) = each($lines)){$user = explode("#",$lines[$key]);}
Das Löschen eines Beitrags funktioniert, ich kann auch einen Beitrag unproblematisch dazu schreiben, aber wenn ich versuche, einen Beitrag zwischen 2 alten zu speichern und _Klammern_ im Text ($user[4]) sind, dann wird eine ID gelöscht und der neue Beitrag wird nicht gespeichert. Die ID der darauffolgenden Beiträgen werden aber richtig erhöht. Z.B. will man nach dem Eintrag 1, ID=1, einen neuen Eintrag "insert" hinzufügen. Eintrag 0 und Eintrag 1 bleiben genau gleich, also mit der gleichen ID, ID=2 ist verschwunden sowohl wie "insert", Eintrag 2 bekommt aber die ID=3 und alle IDs der darauffolgenden Einträge sind brav um 1 erhöht. WARUM????? Ohne Klammern gibt es nämlich überhaupt kein Problem...
Der Code sieht an der Stelle so aus:
while(list($key) = each($lines)){
//user [0] is the number (or id), [1] is the group for the filepath, [2] is the title,
//[3] is the link name for the navigation, [4] is the actual text and [5] is the information about deleting
$user = explode("#",$lines[$key]);
$id = $user[0];
//the ids of the others get put one up unless the new faq simply gets added at the end of the file
if ($idbefore !=""){
//setting new id
$newid = $idbefore + 1;
//adding 1 to the id after the inserted one
if ($id > $newid){$id = $id + 1;}
//recreate a line
$newtext = "%" . $id . "#" . $user[1] . "#" . $user[2] . "#" . $user[3]. "#" . $user[4] . "#" . $user[5];
//adding the line to the rest of the text
$wholetext .= $newtext;
//inserting the line with the new entry and the old one with a new id
if ($id == $newid){
//setting up new line
$newline = "%" . $newid . "#" . $group . "#" . $title . "#" . $linkname . "#" . $text . "#" . $delete;
//reading old line, which is to be replaced
$oldline = "%" . $id . "#" . $user[1] . "#" . $user[2] . "#" . $user[3] . "#" . $user[4] . "#" . $user[5];
//changing the id for the old entry
$idup = $id +1;
//new and old line with new id
$newoldline = $newline . "%" . $idup . "#" . $user[1] . "#" . $user[2] . "#" . $user[3] . "#" . $user[4] . "#" . $user[5];
$wholetext = eregi_replace($oldline, $newoldline, $wholetext);
$wholetext = eregi_replace("%#####", "", $wholetext);
} // end of if ($id == $newid)
} // end of if ($idbefore !="")
else{
//just take the highest id and add one
$id >= $entries;
if ($id != ""){
//recreate a line
$newtext = "%" . $id . "#" . $user[1] . "#" . $user[2] . "#" .$user[3]. "#" . $user[4] . "#" . $user[5];
//adding the line to the rest of the text
$wholetext .= $newtext;
$newid = $id+1;}
else{$newid = "0";}
} // end of first else
} // end of while(list($key) = each($lines))
Ich hoffe, dass das jetzt keine Zumutung ist... Ich habe versucht nur das Wichtigste aus dem Script raus zu nehmen.
Nicola
Hallo,
Ich muss ein Redaktionsystem ohne Datenbankanbindung erstellen.
Mein Beileid.
Die einzelnen Beiträge werden durch "%" getrennt.
Die Unterteile der Beiträge (Titel, Datum, Text...) werden durch "#" getrennt.
Auch wenn ich selbst nicht verstehe, warum Klammern Probleme machen, (der Code sah in Ordnung aus) kann ich Dir mal folgende Lösung anbieten. Diese Lösung solltest Du auf jeden Fall für das Prozentzeichen und die Raute verwenden, jedoch dürfte das bei den Klammern unnötig sein.
Vor dem Einfügen in das Array ersetzt Du das %-Zeichen durch !P, das #-Zeichen durch !R, das !-Zeichen durch !!, das (-Zeichen durch !O und das )-Zeichen durch !G.
(P für Prozent, R für Raute, !! damit man überhaupt noch Ausrufezeichen verwenden kann, O für offen, G für geschlossen)
Wenn Du es wieder ausliest, ersetzt Du alles wieder zurück.
Noch etwas:
$wholetext = eregi_replace("%#####", "", $wholetext);
Warum diese Zeile? Das dürfte doch gar nicht passieren.
Ich hätte noch eine komplett andere Alternative für Dich: (die viel einfacher ist, weil Du Dich um solche Speichermechanismen keine Gedanken machen musst)
Du hälst Deine komplette Datenstruktur direkt verschachtelten Arrays oder Objekten im Speicher. Immer, wenn Du etwas bearbeitest, bearbeitest Du nur diese Strukturen. Das Script selbst liest sich am Anfang den kompletten Dateiinhalt aus und jagt ihn durch die PHP-Funktion unserialize. Wenn die Daten gespeichert werden sollen, jagt es sie durch serialize und speichert das Ergebnis in der Datei.
Also:
1. Datei öffnen, lesen, unserialize => dann steht das Array zur Verfügung
2. Array bearbeiten
3. serialize, schreiben, Datei schließen
Ach ja, Du solltest Dich prinzipiell noch mit Locking beschäftigen, sonst kommt es zu Komplikationen: http://de3.php.net/manual/de/function.flock.php
Christian
Vor dem Einfügen in das Array ersetzt Du das %-Zeichen durch !P, das #-Zeichen durch !R, das !-Zeichen durch !!, das (-Zeichen durch !O und das )-Zeichen durch !G.
(P für Prozent, R für Raute, !! damit man überhaupt noch Ausrufezeichen verwenden kann, O für offen, G für geschlossen)
Ja, das ist wohl das Sinnvollste. % und # werden eh' schon durch "Percent" und "Number" ersetzt.
$wholetext = eregi_replace("%#####", "", $wholetext);
Warum diese Zeile? Das dürfte doch gar nicht passieren.
Das ist wahrscheinlich ein Rest als so was doch mal passiert ist. Da sie sonst nicht gestört hat, habe ich sie gelassen...
Ich hätte noch eine komplett andere Alternative für Dich: (die viel einfacher ist, weil Du Dich um solche Speichermechanismen keine Gedanken machen musst)
Das probier ich aus, aber ich bin noch nicht sicher, ob ich es richtig verstanden habe.
Ach ja, Du solltest Dich prinzipiell noch mit Locking beschäftigen, sonst kommt es zu Komplikationen: http://de3.php.net/manual/de/function.flock.php
O.K.
Vielen Dank!
Nicola
Hallo Christian,
Auch wenn ich selbst nicht verstehe, warum Klammern Probleme machen, (der Code sah in Ordnung aus) kann ich Dir mal folgende Lösung anbieten. Diese Lösung solltest Du auf jeden Fall für das Prozentzeichen und die Raute verwenden, jedoch dürfte das bei den Klammern unnötig sein.
Vor dem Einfügen in das Array ersetzt Du das %-Zeichen durch !P, das #-Zeichen durch !R, das !-Zeichen durch !!, das (-Zeichen durch !O und das )-Zeichen durch !G.
(P für Prozent, R für Raute, !! damit man überhaupt noch Ausrufezeichen verwenden kann, O für offen, G für geschlossen)
Wenn Du es wieder ausliest, ersetzt Du alles wieder zurück.
Es funktioniert, aber nur wenn ( und ) maskiert sind.
Wenn ich folgendes zum Beispiel schreibe:
$title[$x] = eregi_replace("(","openbrotsch",$title[$x]); //openbrotsch weil dieses string unwahrscheinlich auftauchen wird und es spass macht
bekomme ich die Meldung für diese Zeile:
Warning: REG_EPAREN in /home/www/[...]editing_system/faq_update.php on line 117
Ich weiss zwar nicht was REG_EPAREN bedeutet, aber auf blöd habe ich erstmal maskiert und das geht wunderbar:
$title[$x] = eregi_replace("(","openbrotsch",$title[$x]);
Macht das irgendwie Sinn?
Und kannst Du mir vielleicht sagen, wo ich Erklärungen zu den Ausdrücken in den "Warning"-Meldungen finde, zum Beispiel eben REG_EPAREN?
Dein anderer Vorschlag habe ich nicht ignoriert, nur ich werde dafür viel mehr Zeit brauchen weil ich noch nicht so fit bin, und die Leute hier wollen ihr Redaktionssystem gleich benutzen.
Nicola
Hallo,
$title[$x] = eregi_replace("(","openbrotsch",$title[$x]);
Du verwendest eregi_replace - das erwartet einen regulären Ausdruck und in regulären Audrücken haben Klammern eine besondere Bedeutung. str_replace ist hier besser - das erwartet eine Zeichenkette. Verwende Funktionen mit regulären Ausdrücken nur, wenn Du die Mächtigkeit von regulären Ausdrücken auch brauchst. Sonst büßt Du an Geschwindigkeit ein und stößt auf solche Probleme.
//openbrotsch weil dieses string unwahrscheinlich auftauchen wird und es spass macht
Trotzdem solltest Du lieber so maskieren, dass das maskierte Zeichen _nie_ in der Zeichenkette auftreten kann.
(
Macht das irgendwie Sinn?
Ja, denn mit dem \ maskierst Du die Klammer.
Und kannst Du mir vielleicht sagen, wo ich Erklärungen zu den Ausdrücken in den "Warning"-Meldungen finde, zum Beispiel eben REG_EPAREN?
Keine Ahnung, ich verwende nur str_replace und preg_replace. Die ereg-Funktionen sollte man nicht verwenden, da einmal langsam und zum zweiten nicht binärsicher.
Also:
function maskiere ($zeichenkette) {
$ersetzungen = array (
'!' => '!!',
'(' => '!o',
')' => '!g',
'#' => '!r',
'%' => '!p'
);
$von = array_keys ($ersetzungen);
$nach = array_values ($ersetzungen);
return str_replace ($von, $nach, $zeichenkette);
}
function demaskiere ($zeichenkette) {
$ersetzungen = array (
'(' => '!o',
')' => '!g',
'#' => '!r',
'%' => '!p',
'!' => '!!'
);
$nach = array_keys ($ersetzungen);
$von = array_values ($ersetzungen);
return str_replace ($von, $nach, $zeichenkette);
}
Erklärung: In $ersetzungen stehen jeweils die unterschiedlichen Maskierungen. Bei maskiere() muss das Ausrufezeichen ganz am Anfang stehen, das muss zu erst maskiert werden. (sonst passiert das doppelt) Bei demaskiere() muss das Ausrufezeichen ganz hinten stehen, das muss zuletzt demaskiert werden. (sonst gibt es murks)
array_keys holt sich alle Schlüssel eines assoziativen Arrays, also stehen im Ergebnis dann '(', ')', '#', '%' und '!' drin.
array_values holt sich alle Werte eines assoziativen Arrays, also stehen im Ergebnis dann '!o', '!g', '!r', '!p' und '!!' drin.
Allen Ersetzungsfunktionen in PHP (str_replace, eregi_replace, preg_replace) kann man statt Zeichenketten auch Arrays übergeben, dann wird jedes einzelnen Element dieser abgearbeitet.
Wenn dazu noch Fragen sind, stelle sie.
Dein anderer Vorschlag habe ich nicht ignoriert, nur ich werde dafür viel mehr Zeit brauchen weil ich noch nicht so fit bin, und die Leute hier wollen ihr Redaktionssystem gleich benutzen.
Klar. Folgender Thread ist vielleicht interessant: </archiv/2002/12/32932/> (auch wenn er gegen Ende etwas abdriftet...)
Christian
Hallo Christian,
Du verwendest eregi_replace - das erwartet einen regulären Ausdruck und in regulären Audrücken haben Klammern eine besondere Bedeutung.
... und das ist ja das Problem gewesen! Wenn ich Deine Lösung wie folgt benutze:
function mask ($text) {
$replacements = array (
'#' => 'No.',
'%' => 'Percent'
);
$from = array_keys ($replacements);
$after = array_values ($replacements);
return str_replace ($from, $after, $text);
}
... brauche ich die Klammern nicht mehr ersetzen oder maskieren und der Script funktioniert soweit einwandtfrei (zumindest ist mir noch nichts aufgefallen, was nicht in Ordnung wäre). Die Zeichen '#' und '%' brauche ich nicht einmal demaskieren, da sie im Text eh' schöner aussehen wenn sie ausgeschrieben sind.
Übrigens: welche "besondere Bedeutung"?
Also meine Lektion ist gelernt, ab jetzt sage ich nur noch "vade retro, eregi_replace!"
Die ereg-Funktionen sollte man nicht verwenden, da einmal langsam und zum zweiten nicht binärsicher.
Gibt es eigentlich überhaupt Situationen, in denen es trotzdem sinnvoll wäre eregi_replace zu benutzen? Wozu ist es erfunden worden?
//openbrotsch weil dieses string unwahrscheinlich auftauchen wird und es spass macht
Trotzdem solltest Du lieber so maskieren, dass das maskierte Zeichen _nie_ in der Zeichenkette auftreten kann.
Ja das verstehe ich schon, aber es ist zum Beispiel denkbar, dass jemand sich vertippt und z.B. "Was für'n schönen Tag!oma hat Kuchen gebacken" und das wird "Was für'n schönen Tag(ma hat Kuchen gebacken" ausgelesen. Dagegen ist es unwahrscheinlicher "openbrotsch" aus Versehen zu schreiben. Oder übersehe da ich was?
Klar. Folgender Thread ist vielleicht interessant: </archiv/2002/12/32932/> (auch wenn er gegen Ende etwas abdriftet...)
Werde ich mich reinziehen...
Vielen Dank für alles: ich wünsche Dir ein wunderschönes Wochenende!
Nicola
Hallo!
Übrigens: welche "besondere Bedeutung"?
Schau Dir mal http://de3.php.net/manual/de/pcre.pattern.syntax.php an. (das ist zwar für preg*, aber die einfacheren Dinge gelten auch für ereg*) Warum ereg* sich an # und % stößt, ist mir allerdings unklar...
Gibt es eigentlich überhaupt Situationen, in denen es trotzdem sinnvoll wäre eregi_replace zu benutzen?
Jain. Früher stand preg_* nicht überall zur Verfügung.
Außerdem sind das zwei unterschiedliche Standards: ereg_* hält sich an den POSIX.irgendwas-Standard für reguläre Ausdrücke, preg_* orientiert sich an Perl.
[Prozent/No. sehen schöner aus]
Die Entscheidung liegt natürlich bei Dir.
Ja das verstehe ich schon, aber es ist zum Beispiel denkbar, dass jemand sich vertippt und z.B. "Was für'n schönen Tag!oma hat Kuchen gebacken" und das wird "Was für'n schönen Tag(ma hat Kuchen gebacken" ausgelesen. Dagegen ist es unwahrscheinlicher "openbrotsch" aus Versehen zu schreiben. Oder übersehe da ich was?
Ja, Du übersiehst etwas: Ich ersetzt nämlich ! durch !! und wieder zurück. So maskiere ich dann nämlich auch das Ausrufezeichen selbst. So ist das Ding »bombensicher«, egal, was für einen Müll jemand schreibt. (Deswegen ist es auch wichtig, die Ersetzung von ! nach !! ganz am Anfang der Maskierung durchzuführen, die von !! nach ! ganz am Ende der Demaskierung)
Christian