Frage

Ich bin ziemlich neu in regulären Ausdrücken. Ich habe eine Verpflichtung Räume in einem Stück mehrzeiligen Text zu ersetzen. Die Ersetzungsregeln sind diese:

  • Ersetzen Sie alle Leerzeichen am Start-of-line mit einem non-breaking Raum ( ).
  • Ersetzen Sie jede Instanz wiederholt Räume (mehr als einen Raum zusammen) mit der gleichen Anzahl von Nicht-Bruchräumen.
  • Einzelräume, die nicht beim Start-of-line sind, bleiben unberührt.

Ich benutzen den Regex Coach das passende Muster zu erstellen:

/( ){2,}|^( )/

Nehmen wir an, ich habe diese Eingabetext:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

Mit einem PHP regulären Ausdruck Funktion ersetzen (wie preg_replace() ), ich möchte diese Ausgabe erhalten:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

Ich bin glücklich, der mit einfacher Text Ersetzungen mit regulären Ausdrücken, aber ich habe Probleme, herauszufinden, wie innerhalb des Spiels, um mehrmals zu ersetzen, die Ausgabe zu erhalten wünsche ich.

War es hilfreich?

Lösung

Ich würde vermuten, dass es einfacher wäre, jeden Raum zu finden und zu ersetzen. Um dies zu erreichen, verwenden Sie "Look-Ahead" und "Look-behind" Gruppen.

Oder erfahren einen Raum (\x20), die entweder unter Leitung von oder von einem einzelnen Leerzeichen folgt (\s); sondern nur den Raum ersetzen.

$str = "asdasd asdasd  asdas1\n asda234 4545    54\n  34545 345  34534\n34 345\n";

print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", "&#160;", $str);

(I entschied sich für # 160 seit Abschlags nbsp analysiert.)

Ergebnisse in:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;34534
34 345

Für weitere Informationen Besuche PCRE und perlre .


Antwort auf Kommentare

@ Sprogz : Zuerst dachte ich das gleiche. Aber das Beispiel zeigt eine "\n " => "\n&nbsp;" zwischen dem 1. und 2. Linien.

Andere Tipps

Sie können PHP /e Modifikator Ausführen ein Code in den Austausch, die wie folgt verwendet werden:

$str = preg_replace('/( {2,}|^ )/em', 'str_repeat("&nbsp;", strlen("\1"))', $str);

Ich habe den regulären Ausdruck verändert die Räume zu erfassen. Der /m Modifikator legt es in Multi-Line-Modus, so ^ entspricht den Beginn jeder Zeile.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top