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.

È stato utile?

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)/", "&#160;", $str);

(Ho optato per # 160 poiché markdown analizza nbsp.)

Risultati in:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;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("&nbsp;", 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top