2009-07-21 7 views
2

Je suis en train de gratter img src avec php, je peux obtenir le src bien, mais si le src ne comprend pas le chemin complet alors je ne peux pas vraiment le réutiliser. Est-il possible de saisir le chemin complet de l'image en utilisant php (les navigateurs peuvent l'obtenir si vous utilisez le menu contextuel).Scrape FULL image src avec PHP

ie. Comment puis-je obtenir un chemin complet incluant le domaine dans l'un des deux exemples suivants?

src="../foo/logo.png" 
src="/images/logo.png" 

Merci,

Allan

Répondre

3

Vous n'avez pas besoin d'une regex ... juste un peu de patience. Je ne veux pas vraiment écrire le code pour vous, mais juste vérifier si le src commence par http://, et si non, vous avez comme 3 cas différents.

  1. Si elle commence par un / puis préfixer http://domain.com
  2. Si elle commence par .. vous devrez split l'URL complète et hack off pieces jusqu'à ce que le src commence par un /
  3. Else (il commence par un lettre), le prendre le domaine complet, et strip it down to the last slash puis ajouter l'URL src.

Ou .... paresseux et voler ce script

$url = "http://www.goat.com/money/dave.html"; 
$rel = "../images/cheese.jpg"; 

$com = InternetCombineURL($url,$rel); 

// Returns http://www.goat.com/images/cheese.jpg 

function InternetCombineUrl($absolute, $relative) { 
    $p = parse_url($relative); 
    if($p["scheme"])return $relative; 

    extract(parse_url($absolute)); 

    $path = dirname($path); 

    if($relative{0} == '/') { 
     $cparts = array_filter(explode("/", $relative)); 
    } 
    else { 
     $aparts = array_filter(explode("/", $path)); 
     $rparts = array_filter(explode("/", $relative)); 
     $cparts = array_merge($aparts, $rparts); 
     foreach($cparts as $i => $part) { 
      if($part == '.') { 
       $cparts[$i] = null; 
      } 
      if($part == '..') { 
       $cparts[$i - 1] = null; 
       $cparts[$i] = null; 
      } 
     } 
     $cparts = array_filter($cparts); 
    } 
    $path = implode("/", $cparts); 
    $url = ""; 
    if($scheme) { 
     $url = "$scheme://"; 
    } 
    if($user) { 
     $url .= "$user"; 
     if($pass) { 
      $url .= ":$pass"; 
     } 
     $url .= "@"; 
    } 
    if($host) { 
     $url .= "$host/"; 
    } 
    $url .= $path; 
    return $url; 
} 

De http://www.web-max.ca/PHP/misc_24.php

+0

Parfait merci! – Allansideas

+0

Vous n'avez pas considéré le cas avec la balise BASE: http://www.w3.org/TR/html401/struct/links.html#h-12.4 – Viet

+0

@Viet: Bon point. Pas trop difficile à prendre en compte cependant. – mpen

2

Sauf si vous avez l'URL du site que vous commencez avec (dans ce cas, vous pouvez préfixer à la valeur de l'attribut src) il semble que tout ce que vous Il reste avec il y a une chaîne.

Je suppose que vous n'avez accès à aucune information supplémentaire bien sûr. Si vous analysez HTML, je suppose que vous devez être en mesure d'accéder à une URL absolue au moins pour la page HTML, mais peut-être pas.

+0

Ouais, quelqu'un entre dans une URL en une forme qui est biffed dans ce script, qui Mandrin les choses en un DB, qui est appelé à partir d'une autre page, donc je pourrais ajouter le domaine, mais je me demandais s'il y avait une solution plus élégante. Regex n'est pas mon passe-temps préféré. – Allansideas