2009-11-30 6 views
1

J'ai le code suivant ci-dessous sur mon site web. Il est utilisé pour trouver les images dans un bloc de HTML qui n'ont pas http: // ou/devant. Si c'est le cas, l'URL du site Web sera ajoutée au début de la source d'image.PHP et Regex: Ajout de l'URL du site aux images

Par exemple:

<img src="http://domain.com/image.jpg"> will stay the same 
<img src="/image.jpg"> will stay the same 
<img src="image.jpg"> will be changed to <img src="http://domain.com/image.jpg"> 

Je sens que mon code est vraiment inefficace ... Toutes les idées sur la façon dont je pourrais le faire fonctionner avec moins de code?

preg_match_all('/<img[\s]+[^>]*src\s*=\s*[\"\']?([^\'\" >]+)[\'\" >]/i', $content_text, $matches); 
if (isset($matches[1])) { 
    foreach($matches[1] AS $link) { 
    if (!preg_match("/^(https?|ftp)\:\/\//sie", $link) && !preg_match("/^\//sie", $link)) { 
     $full_link = get_option('siteurl') . '/' . $link; 
     $content_text = str_replace($link, $full_link, $content_text); 
    } 
    } 
} 

Répondre

6

Pour commencer, vous pouvez cesser d'utiliser des expressions régulières pour traiter HTML, en particulier quand ce que vous faites est si facilement fait avec un analyseur HTML (dont PHP a au moins 3). Par exemple:

$dom = new DomDocoument; 
$dom->loadHTML($html); 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    $src = $image->getAttribute('src'); 
    $url = parse_url($src); 
    $image->setAttribute('src', http_build_url('http://www.mydomain.com', $url); 
} 
$html = $dom->saveHTML(); 

Problème résolu. Eh bien, presque. Le cas où vous ajoutez le nom d'hôte aux URL relatives mais pas à celles commençant par/est un peu déroutant et n'est pas géré dans cet extrait, mais c'est un changement relativement mineur (il s'agit de vérifier $url['path']).

Voir Parse HTML With PHP And DOM, le Document Object Model, parse_url() et http_build_url(). PHP a de bien meilleurs outils pour cela que les expressions régulières.

Oh et bonne lecture Parsing Html The Cthulhu Way.

0

Essayer de faire correspondre du HTML avec des expressions régulières est très difficile.

Même si votre code peut sembler fonctionner, il y a de fortes chances que certaines étiquettes IMG se fassent passer car elles ne sont pas dans le format exact que vous avez décrit.

0

Ce n'est pas testé, mais je pense quelque chose comme ça ...

preg_match_all('/<img\b[^>]*\bsrc\s*=\s*[\'"]?([^\'">]*)/i', $content_text, $matches); 
4

Peut-être une approche complètement différente peut travailler aussi:

<base href="http://domain.com/" />

+0

homme Oh. Je n'ai jamais connu cette étiquette. Merci d'avoir publié une référence. –

Questions connexes