Bonjour,
Ta regex ne prend pas que les images (on trouve l'attribut scr aussi dans les balises <script>, <video>,...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?php
function is_image_exists ($url)
{
return (@fclose(@fopen($url, 'r')));
}
function scan_images($page)
{
$img_array['ko'] = array();
$img_array['ok'] = array();
$scan = file_get_contents($page);
preg_match_all('#<img[^>]*src="([^>]*)"#Ui', $scan, $match); // src des <img uniquement
// print_r($match[1]); // affiche toutes les URL des img
foreach($match[1] as $img)
{
if(!is_image_exists($img)){
$img_array['ko'][] = $img;
} else {
$img_array['ok'][] = $img;
}
}
return $img_array;
}
?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?php
$page = ( !empty( $_POST['page'] ) )? $_POST['page'] : '';
?>
<form method="post" action="">
Tester la page :<br /><input type="text" name="page" value="<?php echo $page; ?>" style="width:300px;" />
<input type="submit" value="OK" />
</form>
<?php
if( !empty( $page ) )
{
echo 'URL testée : '.$page.'<br />';
echo 'scan_images....... <br />';
$microtime = microtime(true);
$bad_img = scan_images($page);
$microtime = microtime(true)-$microtime;
echo 'Durée du traitement : '.$microtime.' sec.<br />';
echo (count($bad_img['ok'])+count($bad_img['ko'])).' images trouvées<br /><br />';
if( !empty($bad_img['ko']) ) // il existe des images KO
{
echo 'Mauvaises images :<br />';
echo '<pre>'; print_r($bad_img['ko']); echo '</pre>'; // affiche toutes les URL des img KO
} else {
echo 'toutes les images sont OK :<br />';
echo '<pre>'; print_r($bad_img['ok']); echo '</pre>'; // affiche toutes les URL des img OK
}
}
?> |
Attention : ça ne fonctionne pas si les URL des images sont écrites en RELATIF :
<img src="../../images/mon-image.jpg" />
Là, il faut faire un bidouillage supplémentaire...
Partager