Filtre pour newsletters gmail

Contenu du snippet

Voici un nouveau code qui rend compatible une newsletters html à gmail. Et oui car comme tous le monde sait, ou pas :D le webmail gmail n'aime pas parmis plein de chose le css. Il veut que des balises styles, donc le code remplace les balises class par style et met tous les paramètres des cc dans la balise style.
J'espere j'explique pas trop mal.

La fonction main est filtrage qui prend en paramètre une chaine de caractère contenant la newsletters.

Source / Exemple :


<?

$coco = filtrage($string);
echo $coco;

function search_name_class($class)
{
  $long = strlen($class);
  $i = 0;
  if ($class[$i] == "\"")
    {
      $i++;
      while ($i < $long)
        {
          if ($class[$i] == "\"")
            {
              $i--;
              break;
            }
          $i++;
        }
      return(substr($class, 1, $i));
    }
  return(NULL);
}

function isclass($newsletter, $i)
{
  global $globu;     $tmp=substr($newsletter,$i,6);                                                                                                                                          
  if ($tmp == "class=" || $tmp == "CLASS=")
    {  
      $class = substr($newsletter, $i + 6);
      return (search_name_class($class));
    }
  return (0);
}

function check_end_balise($tmp, $balise)
{
  $i = 0;
  $long = strlen($tmp);
  if ($tmp[0] == '/')
    $i++;
  while ($i < $long && $tmp[$i] != '\t' && $tmp[$i] != ' ')
    $i++;
  if ($tmp[0] == '/')
    $bal = substr($tmp, 1, $i);
  else
    $bal = substr($tmp, 0, $i);
  $sav = $i;
  while ($i < $long)
    {
      if (($class = isclass($tmp, $i)))
        break;
      $i++;
    }
  if ($tmp[0] == '/')
    {
      $i = 0;
      while ($balise[$i])
        {
          $check_bal = substr($balise[$i], 0, strlen($bal));
          if ($check_bal === $bal)
            $balise[$i] = "None";
          $i++;
        }
    }
  else
    $balise[] = $bal . ' ' . $class;
  return ($balise);
}

function check_balise($newsletter, $i, $balise)
{
  $i++;
  $j = $i;
  $long = strlen($newsletter);

  while ($i < $long && $newsletter[$i] != '>')
    $i++;
  $tmp = substr($newsletter, $j, $i - $j);
  $balise = check_end_balise($tmp, $balise);
  return ($balise);
}
function filtrage($newsletter)
{
  $letter = $newsletter;
  $i = 0;
  $long = strlen($newsletter);
  while ($i < $long)
    {                                                                                                    
      if (($class = isclass($newsletter, $i)))        {                                                                                                                       
          $letter = replace_css($newsletter, $i, $class, $letter);
	}
      $i++;
    }
  return ($letter);
}

function search_div($div, $class)
{                                                                                               
  $long = strlen($div);
  $i = 0;
  while ($i < $long && $div[$i] != '{')
    $i++;
  $i++;
  $j = 0;
  while ($j < $long && $div[$j] != '}')
    $j++;
  $div = substr($div, $i, $j - $i);                                                                                                          
  return ($div);
}

function search_sub_div($div, $i, $class)
{
  $long = strlen($div);
  while ($i < $long && $div[$i] != '{')
    $i++;
  $i++;
  $j = 0;
  while ($j < $long && $div[$j] != '}')
    $j++;
  $div = substr($div, $i, $j - $i);
  return ($div);
}
function is_div_class($newsletter, $i, $class)
{
  if ($newsletter[$i] == ".")
    {
      $div = substr($newsletter, $i + 1);
      $j = 0;
      $long = strlen($div);
      while ($j < $long)
        {
          if ($div[$j] == " " || $div[$j] == '\t' || $div[$j] == '{')
            break;
          $j++;
        }
      $i = $j;
      while ($i < $long && $div[$i] != '{')
        {
          if ($div[$i] != " " && $div[$i] != '\t')
            {
              if ($class == substr($div, $i, $i - $j))
                return (search_sub_div($div, $i, $class));
              else
                return (NULL);
            }
          $i++;
	}
      if ($class == substr($div, 0, $j))
        return (search_div($div, $class));
      return (NULL);
    }
  return (NULL);
}

function css_exist($newsletter, $class)
{
  $long = strlen($newsletter);
  $i = 0;
  while ($i < $long)
    {
      if (($div = is_div_class($newsletter, $i, $class)))
        {
          return ($div);
        }
      $i++;
    }
  return (NULL);
}

function replace_css($newsletter, $i, $class, $letter)
{
	if (($div = css_exist($newsletter, $class)))
    {
      $div = 'style="' . $div . '"';
      $tmp = 'class="' . $class . '"';
	$letter = eregi_replace($tmp, $div, $letter);
    }
  return ($letter);
}
?>

Conclusion :


Voila excusez moi pour les deux fonctions de plus de 25 lignes.
J'espere que ce code pourra vous être utile.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (durealex)