Sostituzione di spazi usando regex in PHP
-
03-07-2019 - |
Domanda
Sono abbastanza nuovo con le espressioni regolari. Ho l'obbligo di sostituire gli spazi in un testo a più righe. Le regole di sostituzione sono queste:
- Sostituisci tutti gli spazi all'inizio della riga con uno spazio continuo (
& amp; nbsp;
). - Sostituisci qualsiasi istanza di spazi ripetuti (più di uno spazio insieme) con lo stesso numero di spazi non interrompibili.
- I singoli spazi che non sono all'inizio della riga rimangono intatti.
Ho usato il Regex Coach per creare il modello di corrispondenza:
/( ){2,}|^( )/
Supponiamo di avere questo testo di input:
asdasd asdasd asdas1
asda234 4545 54
34545 345 34534
34 345
Uso di una funzione di sostituzione dell'espressione regolare PHP (come preg_replace ()
), voglio ottenere questo risultato:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Sono felice di fare semplici sostituzioni di testo usando espressioni regolari, ma ho difficoltà a capire come sostituire più volte all'interno della partita per ottenere l'output che desidero.
Soluzione
Immagino che sarebbe più facile trovare ogni spazio e sostituirlo. Per farlo, usa " guarda avanti " e " look-behind " gruppi.
Oppure, trova uno spazio ( \ x20
) guidato o seguito da un singolo spazio bianco ( \ s
); ma, sostituisci solo lo spazio.
$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n";
print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", " ", $str);
(Ho optato per # 160 poiché markdown analizza nbsp.)
Risultati in:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Per ulteriori informazioni, consulta PCRE e perlre .
rispondi ai commenti
@ Sprogz : all'inizio, ho pensato lo stesso. Ma l'esempio mostra un " \ n " = & Gt; " \ n & amp; nbsp; "
tra la 1a e la 2a riga.
Altri suggerimenti
Puoi usare il modificatore / e
di PHP per eseguire del codice nella sostituzione, in questo modo:
$str = preg_replace('/( {2,}|^ )/em', 'str_repeat(" ", strlen("\1"))', $str);
Ho cambiato l'espressione regolare per catturare gli spazi.
Il modificatore / m
lo mette in modalità multi-linea, quindi ^
corrisponde all'inizio di qualsiasi riga.