2011-09-23 13 views
16

Sto lavorando con un'espressione regolare in PHP. Ho la seguente stringa:Come abbinare spazio bianco, ritorno a capo e avanzamento riga usando un'espressione regolare in PHP?

<img 
src="/files/admin/hotel_website.gif" alt="Go To The Hotel's Web 
Site" align="absmiddle" border="0" class="hotel_icon" /> 

Questa stringa contiene caratteri di ritorno a capo e avanzamento riga.

Voglio che la mia espressione regolare sostituisca i tag html img con IMG ma questo non funziona con il testo sopra.

Ho scoperto che conteneva questi caratteri eseguendo il looping di ciascun carattere nella stringa e stampando la rappresentazione esadecimale che può essere trovata qui (http://pastebin.com/ViNdBsRV).

Qui è la mia espressione regolare:

strip_tags(preg_replace('/^\s*<img\s*.*\/?>\s*$/i', '[IMG]', $test)); 

apprezzato l'aiuto.

+0

potete per favore mi mostri stringa cosa si aspetta dalla stringa dall'inizio? –

risposta

5

questo:

preg_replace("#<img.+?/>#is", '[IMG]', $test) 

Personalmente quando sto facendo un espressione regolare cerco sempre di andare più breve/più semplice. Qui si desidera sostituire un intero tag, che inizia con '<img' e termina con '/>', '.+?' è un catch non avido (pigro). E per i modificatori 'i' per il caso e 's' a . la possibilità di essere una nuova linea.

Altro su greedyness vs pigrizia: http://www.regular-expressions.info/repeat.html
Maggiori info su modificatori: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Funziona come previsto, grazie per la spiegazione completa. L'ho ottimizzato leggermente per adattarlo anche ad altri casi:/ \ s * $/è – Sid

+0

@Sid Non è necessario aggiungere '\ s $' la mia soluzione funziona già per sostituire' 'su un'intera pagina (questo è come Ho testato la regex). – 3on

+0

Ho aggiunto $ perché sto ottenendo la stringa html da una tabella di database. – Sid

43

[\n\r]+ Far corrispondere nuove linee. Per gli spazi bianchi aggiungono [\n\r\s]+

+0

Ho aggiunto questo alla mia espressione regolare ma non funziona; '/^\ s * \ s * $/i' – Sid

+6

non include \ r e \ n? –

+1

@ Col.Shrapnel: sì – salathe

2

Questo ha funzionato per me corrisponde a più spazi e multilinee, anche qualsiasi altro carattere o un simbolo.

[\S+\n\r\s]+ 

Spero che questo aiuti chiunque.

Si abbina ad esempio:

stpd : asdfasdf 
this is also matching *** 
+4

L'inserimento di un' '' 'dentro '[]' lo fa corrispondere a un valore letterale. '\ S' è l'opposto di' \ s', quindi stai praticamente corrispondendo a qualsiasi carattere. '[\ s \ S] +' è la soluzione come '.' non * normalmente * corrisponde ai caratteri di nuova riga. Non c'è molto uso per questa partita stessa. – bradlis7

Problemi correlati