Comparer une chaine avec un fichier xml et isoler les doublons

lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010 - 17 sept. 2010 à 23:09
lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010 - 6 oct. 2010 à 02:11
Bonsoir,

Je trouve en rond avec un code et plus j'avance et plus ca devient n'importe quoi, je pense qu'il y a beaucoup plus simple.

J'ai un fichier xml ou je stock des adresses emails

Mon xml--------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>

<node mail="email01@hotmail.com" nom="import" />
<node mail="email02@hotmail.com" nom="import" />
<node mail="email03@hotmail.com" nom="import" />
<node mail="email04@hotmail.com" nom="import" />
<node mail="email05@hotmail.com" nom="import" />

---------------------------------------------------

Je voudrais pouvoir envoyer a mon php une variable avec une liste adresses emails séparer par un ";" et qu'il affiche la liste des doublons, et la liste des emails qui ne sont pas enregistrés dans le xml.

Mon PHP------------------------------------------------

<?php
echo "Vous avez ";
include ("compter2.php5");
echo " emails dans votre base";
echo "
----------------------------------------
";
$chaine = "
email01@hotmail.com;
email02@hotmail.com;
email07@hotmail.com;
email03@hotmail.com;
email04@hotmail.com;
email05@hotmail.com;
email06@hotmail.com;
";

$result1=explode(";",$chaine);
$taille = count($result1);
$taille = $taille - 1;

//$id = "lestephnet@hotmail.fr";
$data = new DOMDocument;
$data->load('emails2.xml');
$debut= 0;
foreach($data->getElementsByTagName('node') as $i => $value )
{
if( $debut < $taille){
$debut = $debut - 1;
for($i=0;$i<$taille;$i++){
$leresultat1 = $result1[$i];
$leresultat1 = trim($leresultat1);
$leresultat1=utf8_decode($leresultat1);

if( $value->getAttribute('mail') == $leresultat1){

$mailpasbon .= $leresultat1;
$mailpasbon .="
";
$newchaine = str_replace($mailpasbon,"", $chaine);


}else{
$mailbon .= $leresultat1;
$mailbon .="
";
}
}
}
}
echo '
-------------------------------------------
';
echo "Vous avez envoyé ".$taille." mails";
echo '
-------------------------------------------
';
$taillepasbon = count($mailpasbon);
echo "Emails en double $taillepasbon";
echo '
-------------------------------------------
';
echo $mailpasbon;
echo '
-------------------------------------------
';
echo "Emails ajouté";
echo '
-------------------------------------------
';
echo $mailbon;
echo '
-------------------------------------------
';
?>
-----------------------------------------------------------

Il m'affiche correctement les emails en doubles mais par contre
pour la liste des emails qui ne sont pas présent dans le xml
il me fait totalement n'importe quoi.

Si vous avez la solution ou une méthode plus simple de suis a votre écoute :-) je suis je cherche depuis ce matin.
merci bcp d'avance.

steph

4 réponses

cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
18 sept. 2010 à 14:26
Bonjour,

Un truc dans ce genre peut-être :
<?php
  function litXml($fichier)
  {
    //-- retourne un tableau contenant la liste des mails dans le fichier XML --
    $data =  new DOMDocument;
    $data->load($fichier);
    $items = $data -> getElementsByTagName('node');
    foreach($items as $item )
    {
      $mailXml[] = $item -> getAttribute('mail');
    }
    return $mailXml;
  }

  function litChaine($chaine)
  {
    //-- retourne un tableau contenant la liste des mails contenus dans la chaine --
    $mail = explode(';', $chaine);
    foreach($mail as $cle => $valeur)
    {
      $mail[$cle] = trim($valeur);
    }
    sort($mail);
    return $mail;
  }
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
  $fichier = 'test.xml';

  $listeMail = 'email01@hotmail.com;
                email02@hotmail.com;
                email07@hotmail.com;
                email03@hotmail.com;
                email04@hotmail.com;
                email05@hotmail.com;
                email06@hotmail.com';

  $mailXml = litXml($fichier);
  $mail = litChaine($listeMail);

  $mailManquant = implode('
', array_diff($mail, $mailXml));
  echo '------------------------------------------------------------------------

        emails manquant dans le fichier XML :
 ' . $mailManquant . ' 

';
  
  $mailDoublon  = implode('
', array_intersect($mailXml, $mail));
  echo '------------------------------------------------------------------------

        emails présents dans le fichier XML ET dans la chaine :
' . $mailDoublon . '
';
?>


Cordialement.

JC
0
lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010
29 sept. 2010 à 11:29
Super merci beaucoup ça marche très bien.

Je pensais ajouter un système plus complet pour l'ajout d'emails "en vrac" de différentes sources sans avoir obligatoirement un ";" de séparation.

je voudrais ajouter :

$sChaine= "emails en vrac dans du texte"

function extractEmailsFromString($sChaine) {

if(false !== preg_match_all('`\w(?:[-_.]?\w)*@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})`', $sChaine, $aEmails)) {
if(is_array($aEmails[0]) && sizeof($aEmails[0])>0) {
return array_unique($aEmails[0]);
}
}

return null;
}

retourner $aEmails en chaine et faire un foreach filtre

if(filter_var($leresultat, FILTER_VALIDATE_EMAIL))
{

Tu en penses quoi ? comment l'ajouter proprement à ton code ?



steph
0
cs_jeca Messages postés 341 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 14 juillet 2011 14
29 sept. 2010 à 13:14
Si tu n'as besoin que d'un résultat global :
<?php
  function litXml($fichier)
  {
    //-- retourne un tableau contenant la liste des mails dans le fichier XML --
    $data = new DOMDocument;
    $data->load($fichier);
    $items = $data -> getElementsByTagName('node');
    foreach($items as $item )
    {
      $mailXml[] = $item -> getAttribute('mail');
    }
    return $mailXml;
  }

  function litChaine($chaine)
  {
    //-- retourne un tableau contenant la liste des mails contenus dans la chaine --
    $mail = explode(';', $chaine);
    foreach($mail as $cle => $valeur)
    {
      $mail[$cle] = trim($valeur);
    }
    sort($mail);
    return $mail;
  }

  function extractEmailsFromString($sChaine)
  {
    if(false !== preg_match_all('`\w(?:[-_.]?\w)*@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})`', $sChaine, $aEmails))
    {
      if(is_array($aEmails[0]) && sizeof($aEmails[0])>0)
      {
        return array_unique($aEmails[0]);
      }
    }
    return null;
  }

  function valideMail($mail)
  {
    foreach ($mail as $cle => $valeur)
    {
      if(!filter_var($valeur, FILTER_VALIDATE_EMAIL))
      {
        unset($mail[$cle]);
      }
    }
    return $mail;
  }
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
  $fichier = 'test.xml';

  $listeMail = 'email01@hotmail.com;
                email02@hotmail.com;
                email07@hotmail.com;
                email03@hotmail.com;
                email04@hotmail.com;
                email05@hotmail.com;
                email06@hotmail.com';

//  $sChaine = "emails en vrac dans du texte" ;
  $sChaine = file_get_contents('test.txt');

  $mailXml = litXml($fichier);
  $mailListe = litChaine($listeMail);
  $mailChaine = extractEmailsFromString($sChaine);

  $mailResultat = valideMail(array_unique(array_merge($mailXml, $mailListe, $mailChaine)));
  echo '';
  print_r($mailResultat);
  echo '

';
?>



Cordialement.

JC
0
lestephnet Messages postés 17 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 octobre 2010
6 oct. 2010 à 02:11
super merci bcp une bonne prise de tête de moins :-)

Dis moi tu connais comment ajouter ou modifier un cdata dans un XML avec un createCDATASection , un new DOMCDATASection ou un addCData ? Les docs que je trouve en ligne ne sont pas très claire.
j'ai lancé ce sujet mais personne n'arrive à répondre

http://www.phpcs.com/forum/sujet-PHP-XML-AJOUTER-CDATA-NOEUD_1470587.aspx

Si tu as la solution merci d'avance ;-)

steph
0
Rejoignez-nous