2010-05-14 14 views
5

So che:php: taglia i tag br dall'inizio di una stringa?

preg_replace('<br\s*\/?>', '', $string); 

rimuoverà tutti i tag br da $ string ...

Come possiamo rimuovere tutti i tag <br><br/><br /> solo se sono in fin dall'inizio di $ stringa? ($ String nel mio caso è il codice html con vari tag ...)

risposta

16

basta aggiungere un ancoraggio adeguato (^):

preg_replace('/^(?:<br\s*\/?>\s*)+/', '', $string); 

Ciò corrisponderà multipla <br> s all'inizio della stringa .

(?:…)è un gruppo non catturante poiché utilizziamo solo le parentesi qui per raggruppare l'espressione, non per acquisirla. Il modificatore non è strettamente necessario - (…) funzionerebbe altrettanto bene, ma il motore di espressioni regolari dovrebbe fare più lavoro perché deve quindi ricordare la posizione e la lunghezza di ogni hit catturato.

+0

avrai bisogno di delimitatori intorno alla tua espressione regolare e poiché non è necessario catturare nulla, usa un gruppo non catturante '(?: ...)' – salathe

+0

@salathe: Sì ... li ho aggiunti. Ho appena copiato il codice della domanda in un primo momento, ecco perché li ho dimenticati. - E anche il gruppo non catturante è una buona idea. –

+0

grazie per il consiglio di ancoraggio, questo è quello che mi mancava ... la tua espressione regolare non rimuove tutte le occorrenze ma combinato con questo post: http://stackoverflow.com/questions/133571/how-to-convert-multiple-br -tag-to-a-single-br-tag-in-php la regex corretta dovrebbe essere/^ ( \ s *) +/ cambiarla e segnerò la risposta come accettata – Thanos

4

Hai dimenticato il delimiters for PCRE nell'espressione regolare. Prova questo:

$string = preg_replace('/^\s*(?:<br\s*\/?>\s*)*/i', '', $string); 

Questo rimuoverà anche i principali caratteri di spazi vuoti prima, tra e dopo i tag di interruzione di riga.

Qualche spiegazione:

  • ^\s* corrisponderà alcun carattere di spazio bianco all'inizio della stringa
  • (?:<br\s*\/?>\s*)* corrisponderà a zero o più occorrenze di BR tag (sia HTML e XHTML) seguito da caratteri di spaziatura opzionali
2
$string = preg_replace('@^(<br\\b[^>]*/?>)[email protected]', '', $string); 

deve corrispondere:

<br> 
<br/> 
<br style="clear: both;" /> 
etc 
+0

Attento ora - il richiedente voleva che funzionasse su un particolare set limitato di HTML, che permetteva di evitare [Cthulu] (http: // StackOverflow.com/domande/1732348 /) regex match-aperti-tags-tranne-xhtml-auto-tag-contenevano. La follia si trova nel percorso del tuo "etc". :) Anche se sono d'accordo,
è abbastanza comune da prendere in considerazione, quindi upvoted. – Jerph

+0

Questo sembra funzionare per quello che stavo cercando. Funziona su qualsiasi legittimo tag '
'? – qitch

Problemi correlati