• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

string replace kleiner fehler???

mario_blank

New member
hallo Leute,
Mein erster Beitrag hier im Forum!

Ich arbeite gerade an einem kleinen Eingabeformular, das einst ein Kollege von mir programmierte! Es funktioniert echt toll, und ist genau das was ich brauche! Mein Freund weiß aber leider auf mein Problem auch keine Antwort, daher wende ich mich an euch!

Das Forumular arbeitet wie die Eingabemaske hier im Forum, also mit einer Art BBCodes, allerdings selbst programmiert! Beim speichern der Eingabe wird mit formatValue von z.B. in <b> umgewandelt und gespeichert! Wenn ich die Eingabe wieder editieren will, dann wird mit unformatValue von <b> in zurückgewandelt! Ich denke mir, es wäre eigentlich wesentlich besser, einmal die formatierte Eingabe und einmal die Unformatierte zu speichern und diese beim Editieren zu laden! Aber um da jetzt umzuprogrammieren fehlt mir einfach das Können! Bin noch Anfänger!

Nun jetzt hab ich im Grunde alles beschrieben, nun zu meinem Problem, das das einzige ist das mich stört:

PHP:
<?php
function formatValue($oldString) {
  $pagetring = $oldString;
  // url
  $pagetring = preg_replace("#\[url=(.+?)\](.+?)\[\/url\]#is", '<a href="$1" target="_blank">$2</a>', $pagetring );

  return stripslashes($pagetring);
}
function unformatValue($oldString) {
  $pagetring = $oldString;
  // url
  $pagetring = preg_replace('#<a href="http\://([^"]+)"[^>]*>(.+)</a>#is', '[url=http://$1]$2[/url]', $pagetring);
  
  return $pagetring;
}
?>

Wenn ich google schreibe und speichere, wird korrekt umgewandelt! wenn ich wieder editiere wird auch wieder korrekt in bbcode umgewandelt, ABER...

Wenn ich zwei Links untereinander schreiben will, dann wird leider beim Editieren nicht mehr richtig zurück gewandelt!

also ich speichere...
PHP:
[url=http://www.google.at]link1[/url]
[url=http://www.yahoo.com]link2[/url]
und beim Editieren entsteht...
PHP:
[url=http://www.google.at]link1</a>
<a href="http://www.yahoo.com" target="_blank">link2[/url]

Es funktioniert ja sogar, aber ich denke mir, wahrscheinlich ist das nur ein kleiner Fehler!

Kann mir da jemand helfen, bzw. liegt der Fehler anderswo?

Ich bin für jede Hilfe dankbar!

Lg mario
 
1. Warum speicherst du nicht den originalen Text und wandelst ihn nur zur Darstellung um?
2. Probier mal:
Code:
$pagetring = preg_replace('#<a href="http\://([^"]+)"[^>]*>(.+?)</a>#is', '[url=http://$1]$2[/url]', $pagetring);
".+" ist normalerweise gierig.
 
Och, ich habe noch eine Frage bei der ich dachte ich könne das Problem selber lösen! Ich versuche schon seit zwei Tagen einen Weg zu finden um den kleinen Fehler zu beheben!

Vielleicht ist das für einen von euch sofort erledigt! Ich schaffs nicht!
Ich dachte anfangs es liegt an eine Stylesheet Einstellung aber, ...ich glaube nicht!

Es liegt wieder am string replace!

Und zwar wird bei einem Umbruch im Eingabefeld folgendes umgewandelt:

PHP:
function formatValue($oldString) {
  $pagetring = $oldString;
  $pagetring = str_replace("\\'", "'", $pagetring);  
  //$pagetring = str_replace('\\"', '\'', $pagetring);
  $pagetring = str_replace("\r\n", "<br/>", $pagetring);
  $pagetring = str_replace("\n", "<br/>", $pagetring);
  $pagetring = str_replace("\r", "<br/>", $pagetring);
  $pagetring = str_replace("  ", "  ", $pagetring);

//das hier habe ich im Internet gefunden und selbst implementiert, funktioniert auch einwandfrei!!!

 // ul
  $pagetring = str_replace("[list]", '<ul>', $pagetring); 
  $pagetring = preg_replace("#\[\*\](.*?)<br/>#is", "<li>$1</li>", $pagetring); 
  $pagetring = str_replace("[/list]", "</ul>", $pagetring);

und es gibt aber ein Problem mir der "UNSORTIERTEN LISTE" das so minimal ist, dass es mir schon fast zu blöd ist diese Frage zu stellen!

ich hoffe ich kanns erklären...
Wenn ich in der Eingabe im Formular mache und eine Unsortierte Liste wähle, schaut das so aus:
PHP:
[list]
[*]listenelement1
[*]listenelement2
[/list]

und es wird eigentlich auch korrekt umgewandelt in (Seitenquelltext):
PHP:
<div class="text"><ul><br/><li>listenelement1</li><li>listenelement2</li></ul><br/></div>
Die Liste wird mir korrekt dargestellt und schaut genau so aus wie ich sie haben will, nur...wie ihr sehen könnt entsteht nach dem <ul> ein <br/>!!!
Das ist mir auch relativ logisch, da ja Umbrüche im Eingabefeld als <br/> interpretiert werden!! ODER?

Gibt es eine Möglichkeit dieses Problem "programmier-technisch" zu beheben, ohne dass ich so
  • listenelement1 mache???

    Ist mein Problem verständlich? Wenn es eine Lösung gibt wär ich euch ein allerletztes mal sehr dankbar! Ich habe schon ne weile recherchiert und probiert, finde aber keine lösung!

    Danke und schönen Tag noch.
 
Moin,
erstmal: str_replace kann auch mit Arrays arbeiten, dies könnte (falls sinnvoll implementiert) schneller sein.

Das <br/> kannst du loswerden in dem du einfach nach einer [/list] mit <br/> suchst

PHP:
$search = array("\\'", "  ", "[list]");
$replace = array("'",  "  ",  '<ul>');
$pagetring = str_replace($search, $replace, $pagetring);

$search_nl = array("\r\n","\n", "\r");
$pagetring = str_replace($search_nl, "<br/>", $pagetring); 

$search_list_end = array("[/list]<br/>", "[/list]");
$pagetring = str_replace($search_list_end, "</ul>", $pagetring);

Man kann natürlich auch alles jeweils einem Array zusammenfassen, fand das jedoch zu unübersichtlich. Wichtig ist die Reihenfolge in den Arrays (\r\n muss immer vor \r stehen) und auch bei der Ersetzung (erst nach den Zeilenumbrüchen suchen, bevor die list ersetzt wird). Das [/list] brauchst du für den Fall, dass jemand direkt an dem BBCode weiter geschrieben hat.

Ich würde dir auch empfehlen, deinen BBCode erst bei der Darstellung umzuwandeln. Wenn du später mal deine Darstellung ändern willst (zb. nen Style Attribute in die Liste, oder nötige Anpassung an HTML 5) brauchst du nur deine Funktion anzupassen, solltest du allerdings den HTML-Code speichern musst du auch alle Daten anfassen.

Wenn es eine Lösung gibt wär ich euch ein allerletztes mal sehr dankbar!
Ich hoffe du bist uns auch beim nächsten Mal noch dankbar ;)
 
:Dklar bin ich euch immer dankbar!

Das Forum fängt an mir zu gefallen. Das mit den Arrays wusste ich nicht, dein code ist aber sehr logisch für mich. Aber funktionieren tut es bei mir nicht? Komisch, ich werde es weiterhin versuchen!

PHP:
  // ul
	$pagetring = str_replace("[list]", '<ul>', $pagetring); 
	$pagetring = preg_replace("#\[\*\](.*?)<br/>#is", "<li>$1</li>", $pagetring); 
	$pagetring = str_replace("[/list]", "</ul>", $pagetring);
  
	$search = array("\\'", "  ", "[list]");
	$replace = array("'",  "  ",  '<ul>');
	$pagetring = str_replace($search, $replace, $pagetring);
	
	$search_nl = array("\r\n","\n", "\r");
	$pagetring = str_replace($search_nl, "<br/>", $pagetring); 
	
	$search_list_end = array("[/list]<br/>", "[/list]");
	$pagetring = str_replace($search_list_end, "</ul>", $pagetring);

Das müsste wohl so eh schon stimmen, oder? Zuerst mein code, und dann dein SUCH-UND-REPLACE vorschlag um das <br/> zu beheben!

es ändert sich aber leider gar nichts, bleibt immer noch alles beim Alten!

Ich versuch es weiter, danke derweil!
 
An der Stelle, wo du auf deine fehlerhafte Struktur prüfst, schaut diese anders aus:
Code:
    $search_list_end = array("</ul><br/>", "<ul><br/>");
    $search_list_end_rep = array("</ul>", "<ul>");
    $pagetring = str_replace($search_list_end, $search_list_end_rep, $pagetring);
 
Ich glaub ich spinne! Irgendwie fehlt mir die Logik für das ganze str_replacen! Habe mittlerweile echt viel hinbekommen, aber jetzt bin ich auf den aller-aller-letzten :)D) Mini-Fehler gestoßen!

PHP:
  //ul
  $pagetring = str_replace("<ul>", '[list]', $pagetring); 
  $pagetring = str_replace("<li>", '[*]', $pagetring); 
  $pagetring = str_replace("</li>", "\r", $pagetring); 
  $pagetring = str_replace("</ul>", "[/list]", $pagetring);

Es funktioniert nun wirklich (ehrlich :D) alles außer das Umwandeln von HTML in BBCode beim Listen-element!

Müsste ich nicht einfach nur hinter "
  • " ein \r setzen, damit ich im Forumlar einen Umbruch nach
    • bekomme??

      Also...
      PHP:
      $pagetring = str_replace("<ul>", '[list]\r', $pagetring);
      müsste doch funktionieren oder?
 
Du verwendest die falschen Quotes. Innerhalb von ' sucht PHP nur nach '. Der Rest wird einfach als normales Zeichen interpretiert (\r willst du jedoch als Steuerzeichen für einen Zeilenumbruch verwenden.
Benutz die " stattdessen.
 
Zurück
Oben