2010-06-08 10 views
9

Estoy tratando de escribir una expresión regular que eliminará todos los atributos de etiqueta a excepción del atributo SRC. Por ejemplo:Regex: Strip atributos HTML, excepto SRC

<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p> 

sería devuelto como:

<p>This is a paragraph with an image <img src="/path/to/image.jpg" /></p> 

tengo una expresión regular para quitar todos los atributos, pero estoy tratando de ajustar a dejar en src. Esto es lo que tengo hasta ahora:

<?php preg_replace('/<([A-Z][A-Z0-9]*)(\b[^>]*)>/i', '<$1>', '<html><goes><here>'); 

Utilizando PHP preg_replace() para esto.

Gracias! Ian

+1

Puede analizar HTML usando expresiones regulares. No todo el HTML.Pero si sabe exactamente lo que está recibiendo, puede usar expresiones regulares. Esta es una guerra religiosa iniciada por personas que suponen que hay pilas infinitas y memoria disponible en todas las situaciones. –

Respuesta

1

Muy bien, esto es lo que solía que parece estar funcionando bien:

<([A-Z][A-Z0-9]*)(\b[^>src]*)(src\=[\'|"|\s]?[^\'][^"][^\s]*[\'|"|\s]?)?(\b[^>]*)> 

Siéntase libre de hacer agujeros en él.

7

Youusuallyshould not parse HTML using regular expressions.

En su lugar, debe llamar al DOMDocument::loadHTML.
Puede recurrir a través de los elementos en el documento y llamar al removeAttribute.

+5

Algunas personas, cuando se enfrentan con un problema, piensan "Lo sé, usaré expresiones regulares". Ahora ellos tienen dos problemas. – fmark

+2

Puede analizar HTML utilizando expresiones regulares. No todo el HTML. Pero si sabe exactamente lo que está recibiendo, puede usar expresiones regulares. Esta es una guerra religiosa iniciada por personas que suponen que hay pilas infinitas y memoria disponible en todas las situaciones. –

+5

Algunas personas tienen la terrible costumbre de no responder a la pregunta y en su lugar se obsesionan con los mantras. Esto debería haber sido votado negativamente, no votado por la derecha religiosa. –

1

Lamentablemente no estoy seguro de cómo responder esta pregunta para PHP. Si estuviera usando Perl que haría lo siguiente:

use strict; 
my $data = q^<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>^; 

$data =~ s{ 
    <([^/> ]+)([^>]+)> # split into tagtype, attribs 
}{ 
    my $attribs = $2; 
    my @parts = split(/\s+/, $attribs); # separate by whitespace 
    @parts = grep { m/^src=/i } @parts; # retain just src tags 
    if (@parts) { 
     "<" . join(" ", $1, @parts) . ">"; 
    } else { 
     "<" . $1 . ">"; 
    } 
}xseg; 

print($data); 

que devuelve

<p>This is a paragraph with an image <img src="/path/to/image.jpg"></p> 
11

Esto podría funcionar para sus necesidades:

$text = '<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>'; 

echo preg_replace("/<([a-z][a-z0-9]*)(?:[^>]*(\ssrc=['\"][^'\"]*['\"]))?[^>]*?(\/?)>/i",'<$1$2$3>', $text); 

// <p>This is a paragraph with an image <img src="/path/to/image.jpg"/></p> 

la expresión regular descompone:

/    # Start Pattern 
<    # Match '<' at beginning of tags 
(   # Start Capture Group $1 - Tag Name 
    [a-z]   # Match 'a' through 'z' 
    [a-z0-9]*  # Match 'a' through 'z' or '0' through '9' zero or more times 
)    # End Capture Group 
(?:   # Start Non-Capture Group 
    [^>]*   # Match anything other than '>', Zero or More Times 
    (   # Start Capture Group $2 - ' src="...."' 
    \s   # Match one whitespace 
    src=   # Match 'src=' 
    ['"]   # Match ' or " 
    [^'"]*  # Match anything other than ' or " 
    ['"]   # Match ' or " 
)    # End Capture Group 2 
)?   # End Non-Capture Group, match group zero or one time 
[^>]*?  # Match anything other than '>', Zero or More times, not-greedy (wont eat the /) 
(\/?)   # Capture Group $3 - '/' if it is there 
>    # Match '>' 
/i   # End Pattern - Case Insensitive 

Agregue un poco de citar, y utilizar el texto de reemplazo <$1$2$3> debe quitar cualquier src= propiedades no del bienestar etiquetas HTML formadas

Nota Esto no es necesariamente va a trabajar en TODO de entrada, como el pueblo de Anti-HTML + RegExp son tan hábilmente señalando a continuación. Hay unos pocos retrocesos, sobre todo <p style=">"> terminarían <p>"> y algunas otras cuestiones rotos ... Yo recomiendo mirar Zend_Filter_StripTags como etiquetas plena prueba/atributos de filtro en PHP

+0

A menos que '>' aparezca en un valor de atributo. Analizar HTML malvado es _hard_. Además, olvidaste escapar '\'. – SLaks

+0

¿Qué '\' me olvidé de escapar? – gnarf

+0

+1 para una gran explicación de la expresión. – Anthony

0

Como arriba introducido usted no debe utilizar expresiones regulares para analizar html o xml.

Haría su ejemplo con str_replace(); si todo el tiempo es lo mismo.

$str = '<p id="paragraph" class="green">This is a paragraph with an image <img src="/path/to/image.jpg" width="50" height="75"/></p>'; 

$str = str_replace('id="paragraph" class="green"', "", $str); 

$str = str_replace('width="50" height="75"',"",$str); 
0

Publicación para proporcionar una solución para Oracle Regex

<([^!][a-z][a-z0-9]*)([^>]*(\ssrc=[''''\"][^''''\"]*[''''\"]))?[^>]*?(\/?)> 
Cuestiones relacionadas