thecreep: preg_replace - Zeilenumbrüche mit "\n" erstzen

Hallo
ich durchforste schon seit geraumer Zeit das Internet, leider habe ich noch keine Lösung des Problems gefunden...
Mir geht es um folgendes:

mit PHP schreibe ich den Parameter für eine Javascript-Funktion, da nun aber dieser Parameter Zeilenumbrüche hat, sieht der resultierende Text so aus:

<img src="/IMAGES/editor_quote.png" onclick='javascript: InsertCode("[QUOTE=user]Test Quote  
  
mfg User[/QUOTE]","");'>

nun möchte ich per preg_replace ausobigem Code diesen machen:
<img src="/IMAGES/editor_quote.png" onclick='javascript: InsertCode("[QUOTE=user]Test Quote\n\nmfg User[/QUOTE]","");'>

Quasi alles schön in eine Zeile. Leider weiß ich nicht welchen regulären Ausruck ich verwenden soll...

mit preg_replace("/\n/","\n",$line["CONTENT"]) kommt folgendes raus:

<img src="/IMAGES/editor_quote.png" onclick='javascript: InsertCode("[QUOTE=user]Test Quote  
\n  
\nmfg User[/QUOTE]","");'>

Quasi sind die "\n"'s richtig, aber die Zeilenumbrüche immernoch da.

Ich hoffe ihr könnt mir helfen :|
mfg thecreep

  1. Hast du dir schon mal die Zeichen angesehen, die wirklich im Quelltext stehen

    "sieht so aus" ist zwar visuell ganz nett - aber aber du hast verabsäumt, nachzuprüfen, was wirklich daherkommt.

    Je nach System unter dem die Quelldaten gespeichert wurden ist ein Zeilenumbruch keineswegs nur U+000A.

    1. "sieht so aus" ist zwar visuell ganz nett - aber aber du hast verabsäumt, nachzuprüfen, was wirklich daherkommt.

      Ich hab die Seite mit Firefox geöffnet und anschließend den Quelltext so gefunden im Quelltextfenster von Firefox.

      Daher denke ich, dass das auch wirklich so ausgegeben wird :(

      1. Daher denke ich, dass das auch wirklich so ausgegeben wird :(

        Das bezweifle ich auch nicht.

        Du versäumst aber, deine eigentliche Datenquelle zu analysierne. Du nimmst pauschal an, dass der Zeilenumbruch ausschließlich durch das Linefeed-Zeichen erzeugt wird - offensichtlich stimmt das nicht. Es gibt eine ganze Reihe nicht sichtbarer (bzw. nicht druckbarer) Zeichen. U+200B (ZERO WIDTH SPACE) ist z.B. so ein Fall.

        Siehe hier:
        foo​​​​​bar

        Augenscheinlich sieht das nach folgendem aus:
        U+0066 = f
        U+006F = o
        U+006F = o
        U+0062 = b
        U+0061 = a
        U+0072 = r

        Tatsächlich aber wird dir ein Hex-Editor folgendes zeigen:
        0066 006F 006F 200B 200B 200B 200B 200B 0062 0061 0072

        Mit jeglicher Ersetzungsfunktion wirst du dich schwarz ärgern, weil du "foo​​​​​bar" nicht finden wirst wenn du nach "foobar" suchst.

        1. Mit jeglicher Ersetzungsfunktion wirst du dich schwarz ärgern, weil du "foo​​​​​bar" nicht finden wirst wenn du nach "foobar" suchst.

          Hmmm und wie könnte ich das Problem sonst lösen?

          mfg thecreep

          1. Hmmm und wie könnte ich das Problem sonst lösen?

            Bevor du etwas ersetzt, sieh dir an, was überhaupt zum Ersetzen da ist (bzw was du ersetzen möchtest).

            Im Falle von Zeilenumbrüchen ist das relativ einfach - da gibts idR. nur 3 Möglichkeiten.

            Ein guter Editor zeigt dir auch Zeichen an, die du nicht siehst. Das ist das Erste was hier zu tun ist.

            1. Ein guter Editor zeigt dir auch Zeichen an, die du nicht siehst. Das ist das Erste was hier zu tun ist.

              Naja das Problem an der ganzen Sache ist, dass der Text ja aus der Datenbank kommt, daher kann ich nich ma ebend mir das in 'nem HEX-Editor angucken oder?

              1. Naja das Problem an der ganzen Sache ist, dass der Text ja aus der Datenbank kommt, daher kann ich nich ma ebend mir das in 'nem HEX-Editor angucken oder?

                Du könntest z.B. mb_encode_numericentity() verwenden um einen gegebenen String in seine Codepoints zu zerlegen (das ist jedenfalls - wenn man keinen Hex-Editor zur Verfügung hat die sinnvollste Art und Weise).

                Da es in deinem Fall nur um Zeilenumbrüche geht und nicht um irgendwelche Fallstricke mit anderen nicht-druckbaren Zeichen gibt es wie bereits erwähnt nur 3 Möglichkeiten. Warum du bisher nicht auf die Idee gekommen bist, einfach in irgend einer Suchmaschine nach "Zeilenumbruch" zu suchen, ist mir Schleierhaft.

                In Kombination mit der PHP-Doku solltest du das Rätsel um die Identität der möglichen Zeichen dann lösen.

                Wenn das geschafft ist, kannst du dich um den regulären Ausdruck kümmern - oder auch darauf verzichten.

                In seiner aktuellen Form (wo du nur ein definiertes Zeichen ersetzt) ist er jedenfalls eine absolute Performancevergeudung.

                Wenn du die möglichen Kandidaten isoliet hast, solltest du jedenfalls nochmal über die Verwendung von str_replace() nachdenken.

                1. Hi!

                  Naja das Problem an der ganzen Sache ist, dass der Text ja aus der Datenbank kommt, daher kann ich nich ma ebend mir das in 'nem HEX-Editor angucken oder?

                  Ausgeben, speichern in Textdatei, öffnen im Hexeditor wäre eine Möglichkeit.

                  Du könntest z.B. mb_encode_numericentity() verwenden um einen gegebenen String in seine Codepoints zu zerlegen (das ist jedenfalls - wenn man keinen Hex-Editor zur Verfügung hat die sinnvollste Art und Weise).

                  Da muss man ja drei Parameter übergeben, darunter ein Array mit mindestens vier Werten ... (raw)urlencode() ist da einfacher zu bedienen. (raw)urlencode() ist zwar eigentlich nicht dafür vorgesehen, eignet sich aber auch für solche Debug-Zwecke recht gut. bin2hex() kann man auch nehmen, doch da steht die Ausgabe ohne Pause hintereinanderweg. chunk_split(bin2hex($delinquent), 2, ' ') macht die Ausgabe einfacher lesbar.

                  Lo!