2011-09-20 4 views
22

Sto cercando di ottenere la prima immagine da ciascuno dei miei post. Questo codice qui sotto funziona alla grande se ho solo un'immagine. Ma se ne ho più di uno mi dà un'immagine ma non sempre la prima.Ottenere la prima immagine nella stringa con php

Voglio solo la prima immagine. Un sacco di volte la seconda immagine è un pulsante accanto

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 

preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $texthtml, $matches); 
$first_img = $matches [1] [0]; 

Ora posso prendere questa "$ first_img" e bastone davanti alla breve descrizione

<img alt="Sara" title="Sara" src="<?php echo $first_img;?>"/> 

risposta

38

Se avete solo bisogno il primo tag di origine, preg_match dovrebbe fare, invece di preg_match_all, fa questo lavoro per voi?

<?php 
    $texthtml = 'Who is Sara Bareilles on Sing Off<br> 
    <img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
    <img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
    preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $texthtml, $image); 
    echo $image['src']; 
?> 
+1

Stranamente, l'ho sostituito con il tuo codice e sto ancora ottenendo la seconda immagine – MHowey

+0

Potresti incollare qui l'html che sta fallendo perché come dice Kelsey anche il tuo codice dovrebbe funzionare, quindi sarebbe più facile tenere traccia di sbagliato se abbiamo un esempio che fallisce. – derp

+12

Il tuo codice non è troppo goloso? Quindi se il tag alt arriva dopo lo src, lo catturerà anche lui. Hai bisogno di '+?' Invece di '+'. Quindi hai: 'preg_match ('/ . +?) [\'"]. *>/I ', $ texthtml, $ immagine) ' –

1

Sei sicuro l'espressione regolare è sempre abbinare il primo? Provare a stampare l'array ogni volta che si chiama per vedere:

error_log(var_export($matches, true));

+0

Quello è il mio problema. Restituisce sempre un'immagine ma mi serve per restituire solo la prima immagine – MHowey

+0

Bene, il tuo codice sembra funzionare correttamente (non ho controllato l'espressione regolare). Stai accedendo al secondo array, che contiene i pattern catturati, e quindi il primo elemento di quell'array, che è la prima immagine. Hai provato a stampare l'intero array e assicurandoti che quando vedi l'immagine sbagliata, anche la prima immagine corrispondesse? Scommetto che no. –

5

Non utilizzare regex per analizzare html. Utilizzare un html parsing lib/classe, come phpquery:

require 'phpQuery-onefile.php'; 

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sarahehe" title="Saraxd" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
$pq = phpQuery::newDocumentHTML($texthtml); 
$img = $pq->find('img:first'); 
$src = $img->attr('src'); 
echo "<img alt='foo' title='baa' src='{$src}'>"; 

download: http://code.google.com/p/phpquery/

+1

Grazie, ma l'ultima cosa che voglio è aggiungere una tonnellata di codice per risolvere un piccolo problema di immagine.preg_match va bene per alcune linee di html chiamate da sql. Ma grazie per aver trovato il tempo di rispondere allo – MHowey

+1

sì, forse una tonnellata di codici ma nella domanda di prestazioni phpQuery è molto più veloce se confrontato con le espressioni regolari. –

+0

Sarei d'accordo nella maggior parte dei casi. Ma questo è per un piccolo blog che mostra 5 immagini per pagina. Terrò in mente il tuo suggerimento. E ti ringrazio davvero per questo / – MHowey

2

Dopo aver testato una risposta da qui Using regular expressions to extract the first image source from html codes? ho ottenuto risultati migliori con le immagini di collegamento meno rotti rispetto alla risposta fornita qui.

Mentre le espressioni regolari possono essere utili per una grande varietà di attività, trovo che di solito non è sufficiente quando si analizza il DOM HTML. Il problema con HTML è che la struttura del tuo documento è così variabile che è difficile da calcolare accuratamente (e con precisione intendo il 100% di successo senza falsi positivi) estrarre un tag.

Per risultati più coerenti, utilizzare questo oggetto http://simplehtmldom.sourceforge.net/ che consente di modificare l'html. Un esempio è fornito nella risposta nel primo link che ho postato.

function get_first_image($html){ 
require_once('SimpleHTML.class.php') 

$post_html = str_get_html($html); 

$first_img = $post_html->find('img', 0); 

if($first_img !== null) { 
    return $first_img->src'; 
} 

return null; 
} 

Godetevi