Une petite fonction qui va changer les urls relatives d'une portion d'html en url absolues.
S'applique
- aux attributs href, src et background
- aux fonction css url() et src() présentes dans les attributs et balises style.
Si une url commence par une chaîne alphabétique suivi de ":" elle est ignorée (mailto:, http://, ftp://...).
Je pense que ça peut être amélioré (j'ai fait ça en vitesse). Par exemple, je ne sais pas trop comment ça se passe pour les url commençant par "./" et n'ai donc pas prévu de règle spécifique, votre expérience est la bienvenue.
Je ne suis pas sur non plus de devoir limité le filtre de protocole aux caractères alphabétique seulement.
J'attend vos remarques
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 function absolutize($html, $base) { $base = rtrim($base, '/').'/'; // href, src, background attributes $html = preg_replace('#(<[^>]+(href|src|background)=")(?![a-z]+:)/?([^"]+)"#is', '$1'.$base.'$3"', $html); // style attributes url(), src() $html = preg_replace('#(<[^>]+style="[^"]*(url|src)\([\s\']*)(?![a-z]+:)/?([^)]+)\)#is', '$1'.$base.'$3)', $html); // style tag preg_match_all('#<style[^>]*>([^<]+)#is', $html, $styles); foreach($styles[1] as $style){ $html = str_replace( $style, preg_replace('#((url|src)\([\s\']*)(?![a-z]+:)/?([^)]+)\)#is', '$1'.$base.'$3)', $style), $html); }; return $html; } // Utilisation : $absoluteHtml = absolutize('ma chaîne html', 'http://www.mon-domaine.com');
Partager