2010-05-14 35 views
5

sé que:php: etiquetas trim br desde el comienzo de una cadena?

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

eliminará todas las etiquetas br partir de $ cadena ...

¿Cómo podemos eliminar todas las etiquetas <br><br/><br /> sólo si están en el mismo comienzo de $ cadena? ($ Cadena en mi caso es el código html con diferentes etiquetas ...)

Respuesta

16

Sólo añadir un anclaje adecuado (^):

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

Esto corresponderá con múltiples <br> s al comienzo de la cadena .

(?:…) es grupo no capturado ya que solo usamos los paréntesis aquí para agrupar la expresión, no para capturarla. El modificador no es estrictamente necesario: (…) funcionaría igual de bien, pero el motor de expresión regular tendría que hacer más trabajo porque luego debe recordar la posición y la duración de cada hit capturado.

+0

necesitará delimitadores alrededor de su expresión regular y, como no es necesario capturar nada, utilice un grupo que no se capture '(?: ...)' – salathe

+0

@salathe: Sí ... los he agregado. Acabo de copiar el código de la pregunta al principio, es por eso que los olvidé. - Y el grupo que no captura es una buena idea, también. –

+0

gracias por la punta del ancla, eso es lo que me faltaba ... su expresión regular no elimina todas las ocurrencias, sino que se combina con esta publicación: http://stackoverflow.com/questions/133571/how-to-convert-multiple-br -tag-a-uno-br-tag-in-php la expresión regular correcta debería ser/^ ( \ s *) +/ cambiarla y marcaré la respuesta como aceptada – Thanos

4

Olvidó el delimiters for PCRE en su expresión regular. Pruebe esto:

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

Esto también eliminará los caracteres iniciales del espacio en blanco antes, entre y después de las etiquetas de salto de línea.

algunas explicaciones:

  • ^\s* coincidirá con cualquier carácter de espacio en blanco en el inicio de la cadena de
  • (?:<br\s*\/?>\s*)* coincidirá con cero o más ocurrencias de BR etiquetas (HTML y XHTML) seguido por espacios en blanco opcionales
2
$string = preg_replace('@^(<br\\b[^>]*/?>)[email protected]', '', $string); 

debe coincidir:

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

Ten cuidado ahora: el asker quería que funcionara en un determinado conjunto limitado de HTML, lo que permitía evitar [Cthulu] (http: // stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags). La locura está en el camino de tu "etc." :) Aunque estoy de acuerdo,
es lo suficientemente común como para considerarlo, por lo que se votó a favor. – Jerph

+0

Esto parece funcionar para lo que estaba buscando. ¿Funciona esto en cualquier etiqueta legítima '
'? – qitch

Cuestiones relacionadas