Ersetze jedes Zeichen durch ein Element

9

Das ist was ich habe

%Vor%

Das ist was ich brauche

Ergebnisse in Spannen und Leerstellen können ebenfalls neue Zeilen sein.

%Vor%

Sie könnten sich fragen, wofür ich das möglicherweise brauche. Ich möchte etwas erschaffen, wo immer ein Charakter durch einen Block repräsentiert wird. Wird unter Windows XP ein wenig wie Defrag aussehen.

Frage

  • Ersetzen Sie jedes Zeichen durch <span></span> .
  • Berühren Sie nicht die HTML-Spanne, die bereits in der Zeichenfolge vorhanden ist (möglicherweise hart?). Es kann mehr als ein HTML-Element geben.
  • Berühren Sie keine Leerzeichen und Zeilenumbrüche.
  • Regexp sollte es tun? oder Xpath?

Was habe ich bisher gemacht?

Ich habe Artikel über die Regexp gefunden, aber nicht jedes Zeichen ersetzt (Auszug Leerzeichen und Newline)

%Vor%     
Jens Törnell 30.04.2013, 10:09
quelle

7 Antworten

1

Es gibt keine Notwendigkeit für Hacky Regex-Lösungen. Eine einfache for-Schleife mit einem Zustandsautomaten sollte gut funktionieren:

%Vor%

Diese Schleife behält nur den Überblick, wenn wir ein Tag oder ein einzelnes Zeichen lesen. Wenn es sich um ein Tag (oder Leerzeichen) handelt, hängen Sie das tatsächliche Zeichen an, andernfalls fügen Sie <span></span> an.

Ergebnisse in:

%Vor%     
alexn 30.04.2013, 20:15
quelle
2

Sie können preg_replace_callback()

verwenden %Vor%

Dies ist nur die Ersatzzeichenfolge abhängig von der Übereinstimmung zu berechnen. Wenn die Länge der Übereinstimmung 1 ist (es wurde kein Leerzeichen gefunden), ersetzen Sie sie durch die "span" -Tags, andernfalls wurde ein span-Tag gefunden.

    
stema 30.04.2013 11:08
quelle
1

ist es erforderlich, nur einen regulären Ausdruck zu verwenden?

wenn nicht - Sie könnten Teilstrings ersetzen, die Sie mit einem eindeutigen Zeichen sichern müssen, führen Sie das Ersetzen durch regexp aus, setzen Sie anstelle dieses eindeutigen Zeichens Teilstrings.

Einfach so:

%Vor%

Siehe Live-Demo Ссылка

UPD:

Vielleicht sollte es nur als Hinweis betrachtet werden. Mein Vorschlag war, Teilstrings zu speichern, was gespeichert werden musste, alles zu ersetzen, was Sie brauchen, gespeicherte Werte wieder in Strings zu speichern.

%Vor%

Arbeitsdemo gibt es Ссылка

    
Ruslan Polutsygan 30.04.2013 10:33
quelle
0

Das ist zwar wahrscheinlich mit einer Regex möglich, aber ich würde mit einer Schleife gehen. Der folgende Beispielcode ist für Single-Byte-Zeichensätze, kann aber für Multi-Byte- (z. B. UTF-16) oder Variablenbyte-Zeichensatz (z. B. UTF-8) geändert werden.

%Vor%

Arbeitsbeispiel

    
dtech 30.04.2013 10:38
quelle
0

Also hier ist, was ich mit preg_replace_callback () : %Vor%

Ausgabe:

%Vor%     
HamZa 30.04.2013 11:06
quelle
0

Etwas von einem Hack, aber versuche das:

%Vor%     
Waygood 30.04.2013 10:40
quelle
0

Dies ist KEINE Hacky-Regex-Methode. Dies ist eine solide, prägnante Lösung mit einer Zeile und einer Funktion, die verhindert, dass eine Batterie von Bedingungen für jedes Zeichen in einer Zeichenfolge durchlaufen werden muss, behält Tags bei und sorgt für Multibyte-Zeichen.

Die Lösung von alexn behält die sichtbare Zeichenlänge von åäö nicht bei. Seine Lösung wird 6 öffnende und schließende Span-Tags auf dem Bildschirm ausgeben anstatt nur 3. Dies ist der Fall, weil mb_ -Funktionen nicht verwendet werden. Achten Sie bei diesem Thema auf keine der Methoden auf dieser Seite, die mb_ vorfixierte Zeichenfolgenfunktionen verwenden.

Meine vorgeschlagene Lösung nutzt die (*SKIP)(*FAIL) -Technik, um alle gefundenen Tags zu ignorieren / zu disqualifizieren und dann nur Zeichen mit Leerzeichen in der Zeichenfolge zu finden.

Code: ( Demo )

%Vor%

Ausgabe: (scrollen Sie nach rechts, um die Auswirkung des Unicode-Flags auf das Muster zu sehen)

%Vor%     
mickmackusa 15.11.2017 02:50
quelle