php
  • regex
  • string
  • 2010-01-22 20 views 28 likes 
    28

    Con PHP, ¿cómo puedo aislar el contenido del atributo src de $ foo? El resultado final Busco me daría sólo "http://example.com/img/image.jpg"Regex y PHP - aislar el atributo src de la etiqueta de img

    $foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />'; 
    
    +5

    In before rage about using regex para analizar HTML. – meagar

    +0

    @meagar - El uso de expresiones regulares es válido (aunque no necesariamente la ruta más eficiente) en este ámbito limitado. –

    +0

    @middaparka/sarcasmo: p – meagar

    Respuesta

    60

    Si no desea utilizar expresiones regulares (o cualquiera de los componentes de PHP no estándar), una solución razonable utilizando el incorporado en DOMDocument class sería la siguiente:

    <?php 
        $doc = new DOMDocument(); 
        $doc->loadHTML('<img src="http://example.com/img/image.jpg" ... />'); 
        $imageTags = $doc->getElementsByTagName('img'); 
    
        foreach($imageTags as $tag) { 
         echo $tag->getAttribute('src'); 
        } 
    ?> 
    
    +0

    ¡Agradable! Esto es muy parecido a lo que terminé haciendo. No estaba al tanto de DOMDocument, pero lo intentaré. – Jeff

    1

    tratar este patrón:

    '/< \s* img [^\>]* src \s* = \s* [\""\']? ([^\""\'\s>]*)/' 
    
    +0

    Esto no funcionará si img está en mayúscula o si el título contiene un '>'. Sería más robusto usar un analizador HTML. –

    31

    Código

    <?php 
        $foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />'; 
        $array = array(); 
        preg_match('/src="([^"]*)"/i', $foo, $array) ; 
        print_r($array[1]) ; 
    

    salida

    http://example.com/img/image.jpg 
    
    +0

    ¡Tenga cuidado con las referencias de entidad '&' y las referencias de caracteres numéricos en los resultados! – bobince

    +1

    ¡Como quieras! =) Aquí hay una sintaxis alternativa: '/ src =" (. *?) "/ I'. –

    +0

    Lo haría de esta manera también. – Alex

    6
    // Create DOM from string 
    $html = str_get_html('<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />'); 
    
    // echo the src attribute 
    echo $html->find('img', 0)->src; 
    

    http://simplehtmldom.sourceforge.net/

    0

    Esto es lo que terminé haciendo, aunque no estoy seguro acerca de la efectividad de este es:

    $imgsplit = explode('"',$data); 
    foreach ($imgsplit as $item) { 
        if (strpos($item, 'http') !== FALSE) { 
         $image = $item; 
         break; 
        } 
    } 
    
    +0

    este enfoque tendrá problemas si la URL de la imagen es relativa al documento, p. "../../img/something.jpg" – tomfumb

    0

    se puede ir en torno a este problema al utilizar esta función:

     
    
    function getTextBetween($start, $end, $text) 
    { 
    $start_from = strpos($text, $start); 
    $start_pos = $start_from + strlen($start); 
    $end_pos = strpos($text, $end, $start_pos + 1); 
    $subtext = substr($text, $start_pos, $end_pos); 
    return $subtext; 
    }
    $foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />';
    $img_src = getTextBetween('src="', '"', $foo);

    5

    Tengo este código:

    $dom = new DOMDocument(); 
    $dom->loadHTML($img); 
    echo $dom->getElementsByTagName('img')->item(0)->getAttribute('src'); 
    

    Suponiendo que sólo hay una img: P

    1

    preg_match resuelve este problema muy bien.

    Véase mi respuesta aquí: How to extract img src, title and alt from html using php?

    3

    Estoy muy tarde para esto, pero tengo una solución simple, pero no se menciona. Cárguelo con simplexml_load_string (si tiene habilitado el modo simplexml) y luego inviértalo en json_encode y json_decode.

    $foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />'; 
    
    $parsedFoo = json_decode(json_encode(simplexml_load_string($foo)), true); 
    var_dump($parsedFoo['@attributes']['src']); // output: "http://example.com/img/image.jpg" 
    

    $parsedFoo viene a través de como

    array(1) { 
        ["@attributes"]=> 
        array(6) { 
        ["class"]=> 
        string(12) "foo bar test" 
        ["title"]=> 
        string(10) "test image" 
        ["src"]=> 
        string(32) "http://example.com/img/image.jpg" 
        ["alt"]=> 
        string(10) "test image" 
        ["width"]=> 
        string(3) "100" 
        ["height"]=> 
        string(3) "100" 
        } 
    } 
    

    He estado usando esto para analizar XML y HTML para unos pocos meses y funciona bastante bien. Todavía no he tenido problemas, aunque no he tenido que analizar un archivo grande con él (me imagino que usando json_encode y json_decode de esa manera se volverá más lento cuanto más grande sea la entrada). Es intrincado, pero es de lejos la forma más fácil de leer las propiedades de HTML.

    +0

    Encontré un pequeño problema con esto la semana pasada. Si un nodo XML tiene atributos y un valor, solo se puede acceder al valor con este método. Terminé teniendo que escribir un analizador simple que transformará el simplexml en una matriz, manteniendo todos los datos. –

    -1

    supongamos que yo uso

    $text ='<img src="blabla.jpg" alt="blabla" />'; 
    

    en

    getTextBetween('src="','"',$text); 
    

    los códigos volverán:

    blabla.jpg" alt="blabla" 
    

    que está mal, queremos que los códigos para devolver el texto entre el atributo cotizaciones de valor, es decir, attr = "valor".

    por lo

    function getTextBetween($start, $end, $text) 
          { 
           // explode the start string 
           $first_strip= end(explode($start,$text,2)); 
    
           // explode the end string 
           $final_strip = explode($end,$first_strip)[0]; 
           return $final_strip; 
          } 
    

    hace el truco !.

    Trate

    getTextBetween('src="','"',$text); 
    

    volverá:

    blabla.jpg 
    

    Gracias a todos lo mismo, porque su solución me dio una visión de la solución final.

    +0

    Realmente no quiero decir que su enfoque sea malo, pero creo que usar domdocument sería una solución mucho mejor a esta pregunta. ref este por ejemplo: http://stackoverflow.com/questions/6441448/how-do-i-get-the-src-attribute-of-img-tags – Abela

    +0

    La biblioteca domdocument es demasiado pesada para una tarea tan simple. eso es como usar una excavadora para aplastar a una serpiente cuando tienes una alternativa de machete. – user3721605

    Cuestiones relacionadas