2012-05-18 31 views
9

Estoy tratando de usar regex para reemplazar el atributo fuente (podría ser imagen o cualquier etiqueta) en PHP.Regex para reemplazar el atributo html src en PHP

Tengo una cadena como esta:

$string2 = "<html><body><img src = 'images/test.jpg' /><img src = 'http://test.com/images/test3.jpg'/><video controls="controls" src='../videos/movie.ogg'></video></body></html>"; 

Y me gustaría convertirlo en:

$string2 = "<html><body><img src = 'test.jpg' /><img src = 'test3.jpg'/><video controls="controls" src='movie.ogg'></video></body></html>"; 

Heres lo que he intentado:

$string2 = preg_replace("/src=["']([/])(.*)?["'] /", "'src=' . convert_url('$1') . ')'" , $string2); 
echo htmlentities ($string2); 

Básicamente didn No cambies nada y me diste una advertencia sobre una cuerda sin esquivar.

¿No envía $1 el contenido de la cadena? Que esta mal aquí ?

Y la función de convert_url es un ejemplo de que he publicado aquí antes:

function convert_url($url) 
{ 
    if (preg_match('#^https?://#', $url)) { 
     $url = parse_url($url, PHP_URL_PATH); 
    } 
    return basename($url); 
} 

Se supone que se deben eliminar las rutas de URL y simplemente devolver el nombre de archivo.

+0

la secuencia original y en lo que quiere convertir son cadenas vacías, ¿falta algo? – ametren

+0

intenta reemplazar el "con \" – Mageek

+0

Acabo de editarlo. – Ashesh

Respuesta

1

usted tiene que utilizar el modificador e.

$string = "<html><body><img src='images/test.jpg' /><img src='http://test.com/images/test3.jpg'/><video controls=\"controls\" src='../videos/movie.ogg'></video></body></html>"; 

$string2 = preg_replace("~src=[']([^']+)[']~e", '"src=\'" . convert_url("$1") . "\'"', $string); 

Tenga en cuenta que cuando se utiliza el modificador e, el fragmento de escritura de reemplazo tiene que ser una cadena para evitar que sea interpretado antes de la llamada a preg_replace.

13

No use expresiones regulares en HTML - use la clase DOMDocument.

$html = "<html> 
      <body> 
      <img src='images/test.jpg' /> 
      <img src='http://test.com/images/test3.jpg'/> 
      <video controls='controls' src='../videos/movie.ogg'></video> 
      </body> 
     </html>"; 

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 

$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
libxml_clear_errors(); 

$doc = $dom->getElementsByTagName("html")->item(0); 
$src = $xpath->query(".//@src"); 

foreach ($src as $s) { 
    $s->nodeValue = array_pop(explode("/", $s->nodeValue)); 
} 

$output = $dom->saveXML($doc); 

echo $output; 

que emite el siguiente:

<html> 
    <body> 
    <img src="test.jpg"> 
    <img src="test3.jpg"> 
    <video controls="controls" src="movie.ogg"></video> 
    </body> 
</html> 
+0

La clase de documento dom no es muy útil si está html incrustado dentro de otra etiqueta HTML como por ej. – Ashesh

+1

@Ashesh no soy yo sigo. Nos mostró el código PHP: le estoy mostrando la solución. – Sampson

+0

Bueno, lo siento, debería haber sido más claro. Esto es lo que estoy diciendo: "". En este caso, el domdocumento no aparecería en la etiqueta de imagen dentro de javascript. Es por eso que necesito usar regex. – Ashesh

1
function replace_img_src($img_tag) { 
    $doc = new DOMDocument(); 
    $doc->loadHTML($img_tag); 
    $tags = $doc->getElementsByTagName('img'); 
    foreach ($tags as $tag) { 
     $old_src = $tag->getAttribute('src'); 
     $new_src_url = 'website.com/assets/'.$old_src; 
     $tag->setAttribute('src', $new_src_url); 
    } 
    return $doc->saveHTML(); 
} 
Cuestiones relacionadas