Adapte un contenu pour son envoi dans un email : convertit les liens relatifs en absolus, modifie le HTML posant problème, ...
/**
* Lors de l'envoi de notifications par mail, les liens relatifs doivent être convertis. Cette fonction
* modifie les liens et les images qui ont une URL relative pour les convertir en URL absolue.
* @param string $contenu Le contenu HTML à traiter
* @param string $url_base L'URL de base du site (pour l'URL absolue)
* @return string Le contenu HTML modifié avec les URL absolues
*/
function utils_mail_prepare_content($contenu, $url_base = NULL) {
if ($url_base) {
/* Le DOMDocument gère mal les accents, il faut donc forcer l'encodage UTF-8 du contenu */
$contenu = utils_convert_utf8($contenu);
$doc = new DOMDocument();
$doc->loadHTML($contenu);
/* Traitement des liens */
$liens = $doc->getElementsByTagName('a');
foreach ($liens as $lien) {
$url = $lien->getAttribute('href');
$url_parts = parse_url($url);
if (!isset($url_parts['host']) || ($url_parts['host'] == '')) {
$lien->setAttribute('href', $url_base . $url);
}
}
/* Traitement des paragraphes à centrer */
$paragraphes = $doc->getElementsByTagName('p');
foreach($paragraphes as $paragraphe) {
$classes = $paragraphe->getAttribute('class');
if(strstr($classes, 'rtecenter') !== FALSE) {
$classes = preg_replace('/rtecenter/', '', $classes);
$paragraphe->setAttribute('class', $classes);
$style = $paragraphe->getAttribute('style');
$style .= 'text-align:center;';
$paragraphe->setAttribute('style', $style);
}
}
/* Traitement des images */
$images = $doc->getElementsByTagName('img');
foreach ($images as $image) {
$url = $image->getAttribute('src');
$url_parts = parse_url($url);
if (!isset($url_parts['host']) || ($url_parts['host'] == '')) {
$image->setAttribute('src', $url_base . $url);
}
/* Conversion des dimensions en style en attributs HTML */
$pattern = '~([a-z-]+)\s*:\s*([^;$]+)~si';
if (preg_match_all($pattern, $image->getAttribute('style'), $match)) {
$style = array_combine(
array_map('strtolower', $match[1]),
array_map(function($val) { return trim($val, '"\' '); }, $match[2])
);
if(!empty($style)) {
$style['width'] = preg_replace('/px/', '', $style['width']);
$style['height'] = preg_replace('/px/', '', $style['height']);
$image->setAttribute('width', $style['width']);
$image->setAttribute('height', $style['height']);
$style = $image->getAttribute('style');
$style = preg_replace('/width:([^;$]+);/', '', $style);
$style = preg_replace('/height:([^;$]+);/', '', $style);
$image->setAttribute('style', $style);
}
}
}
/* Le DOMDocument ajoute le doctype, des balises <head>...Il faut donc les supprimer, car on renvoie ici seulement un morceau de page HTML */
$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $doc->saveHTML()));
} else {
$text = $contenu;
}
return $text;
}