RobDust: preg_replace etwas entfernen mit Außnahmen

Hallo ich will einen code Ausgeben und vorher durchsuchen, und dabei etwas ersetzten mit Ausnahmen.

$s = str_replace(" ", ' ', $s);

Ausgabe von &s:
<p class=default>
xyz:RAL   3000
xyt:RAL   3001
xcq:RAL   3002
</span>
</p>

Hier will ich alle Leerzeichen mit &nbsp; füllen.
so würde vor 3000,3001 und 3002 jeweils 3x&nbsp; stehen.- Leider auch vor class...
und genau da soll meine Außnahme greifen. den ein &nbsp; zwischen <p und class würde meine code zerstören. wie gehe ich mit preg_replace vor?

  1. Om nah hoo pez nyeetz, RobDust!

    Ausgabe von &s:
    <p class=default>
    xyz:RAL   3000
    xyt:RAL   3001
    xcq:RAL   3002
    </span>
    </p>

    Das sieht mir nach tabellarischen Daten aus. Verwende eine Tabelle.

    Matthias

    --
    1/z ist kein Blatt Papier.

    1. Das sieht mir nach tabellarischen Daten aus. Verwende eine Tabelle.

      Guter Hinweis und falls es doch keine tabellarischen Daten sind, ist es zumindest präformierter Text und gehört in ein pre-Element.

      1. Ich nehm mal ein leichteres Beispiel. Vergesst mal die Tabelle.

        also der Inhalt der $Variable ist (Unser Warenwirtschaftsystem gibt das so vor, und ich kann den Code halt nachher nur modifizieren. bevor er wo anders eingelesen wird.

        <p class=defalt>Test Test Test</p>

        nun möchte ich alle Leerzeichen mit &nbsp; füllen.
        Würde ich folgendes ansetzen:
        $Variable = str_replace(" ","&nbsp;",$Variable)

        Dann krieg ich folgenden Code ausgegben:
        <p&nbsp;class=defalt>Test&nbsp;&nbsp;Test&nbsp;&nbsp;Test</p>

        und ebend das &nbsp; zwischen p und class möchte ich gerne als Ausßnahme definieren.... Vielleicht ist str_replace auch nicht der richtige Befehl.
        Weil es keine Ausnahmne kann?!

        1. Find ich schon ein wenig dreist, die selbe Frage nochmal zu formulieren ohne im geringsten auf die bisherigen Antworten einzugehen.

          1. Sorry, war so nicht gemeint.
            Ich hab ja gesagt, vergesst die Tabellen.

            ich habe die Struktur meine Frage halt nochmal neu überdacht und angefragt.

            1. ich habe die Struktur meine Frage halt nochmal neu überdacht und angefragt.

              Und was gefällt an meinem ersten Vorschlag nicht?

              1. ich dachte mit meiner neu Formulierten Frage wird es nicht mehr ein ganz so komplexer Ausdruck, wie du geschrieben hast. Und ich dachte ich bekäme eine Antwort.

                1. ich dachte mit meiner neu Formulierten Frage wird es nicht mehr ein ganz so komplexer Ausdruck, wie du geschrieben hast. Und ich dachte ich bekäme eine Antwort.

                  Du musst vermeiden, dass dein regulärer Ausdruck Leerzeichen aus HTML-Tags oder CDATA-Sections (und noch einige andere Konstrukte) matcht. HTML hat aber eine so komplexe Syntax, dass es unglaublich schwierig wird einen derartigen Ausdruck zu finden. Aber du kannst von vornerein das Replacement nur auf Textknoten anwenden. Dann braucht es nichtmal einen regulären Ausdruck (falls es sich wirklich nur um Leerzeichen handelt).

                  Ich würde dir aber trotzdem dazu raten semantisches HTML zu verwenden, was spricht gegen
                  <p class=defalt><pre>Test Test Test</pre></p>
                  ?

                  1. hi, da kommen wir der Sache schon näher.
                    Ich wollte auch das Replacement nur auf die Textknoten. Der Rest soll ja unberührt bleiben? Und sematisches HTML würde auch gehen.
                    Wie muss meine Funktion lauten, damit ich meine $Variable so verändert bekomme, dass <pre> vor den Texten und </pre> nach den gesetzt wird?

                  2. Tach!

                    Ich würde dir aber trotzdem dazu raten semantisches HTML zu verwenden, was spricht gegen
                    <p class=defalt><pre>Test Test Test</pre></p>
                    ?

                    Die Validität. Nicht um der Validität willen, aber p kann auch in HTML5 nur mehr oder weniger Inline-Elemente (Phrasing content) enthalten. Das heißt, weil pre ein Block-Element ist, wird das p durch sein Auftauchen implizit geschlossen. Da steht dann also im Ergebnis ein leerer Absatz inklusive seiner (Default-)Abstände (abzüglich collapsing margins) und danach dann der präformatierte Block. In der Form gibt das also unnötige Folgeprobleme. Warum nicht gleich nur das p stylen?

                    Aber wenn man schon mit Stringverarbeitung darauf losgehen kann, dann ist es auch möglich, das <p durch <pre und </p> durch </pre> zu ersetzen (str_replace() und strtr() (zweite Variante) reichen dafür).

                    dedlfix.

                    1. Die Validität. Nicht um der Validität willen, aber p kann auch in HTML5 nur mehr oder weniger Inline-Elemente (Phrasing content) enthalten. Das heißt, weil pre ein Block-Element ist, wird das p durch sein Auftauchen implizit geschlossen.

                      Stimmt. Ist bei näherer Betrachtung auch logisch, ein präformierter Text kann schließlich seine eigenen Absätze beinhalten. Ironie bei der Sache ist, dass ich var paar Tagen selber noch darauf hingewiesen habe und den gleichen Fehler jetzt auch mache.

  2. wie gehe ich mit preg_replace vor?

    Das würde ein unfassbar komplexer Ausdruck werden, falls es überhaupt möglich ist.
    Ich würde mit den DOM-Methoden nach Text-Knoten suchen und dann ihren Wert ersetzen.

    Vorallem stellt sich mir aber die Frage nach dem Sinn, alle Leerzeichen durch Non-Breaking-Spaces ersetzen zu wollen. Reichen die CSS-Möglichkeiten um ungewollte Umbrüche zu verhindern in deinem Fall nicht aus?