Problème avec in_array

Eléphant du PHP | 65 Messages

15 août 2024, 09:17

Bonjour,
Pouvez-vous m'aider ?

/* ce prg convertit chaque ligne d'email en domaine
EX.: [email protected] -> @a.goodespoir.com
il lit dans le fichier indesirables.txt chaque ligne d'adresse email
et n'affiche en résultat que le nom de domaine avec le préfixe @
SAUF pour les emails contenus dans in_array,
auquel cas il affiche l'email complet

Le résultat s'affiche sur la page du navigateur.
*/
/*
Contenu de indesirables.txt
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
*/


<?php
echo 'AVANT TRAITEMENT'.'<br>';
$fichier_lire = fopen('indesirables.txt', 'r');
while (!feof($fichier_lire)) {
$ligne= fgets($fichier_lire);
$tab_lignes[] = $ligne;
//echo '<pre>'; print_r ($tab_lignes); echo '</pre>'; //test
//echo $ligne.'<BR>'; //test
}
fclose($fichier_lire);

echo 'APRES TRAITEMENT'.'<br>';
foreach ($tab_lignes as $email)
{
//echo 'EMAIL= '.$email.'<BR>'; //test
list($prefixe,$domaine)= explode("@",$email);
//echo 'PREFIXE= '.$prefixe.' || '.'DOMAINE= '.$domaine; //test
$tab_except = array('azecris.fr', 'gmail.com');
if (in_array($domaine, $tab_except)) { // domaine est la valeur cherchée
echo $email;
echo '<BR>';
} else {
echo "@".$domaine;
echo '<BR>';
}
}
?>


/*
APRES TRAITEMENT - j'obtiens :
@sfr.fr
@azecris.fr
@gmail.com
@offreann.tqireireorhnotmonedn.fr
@isr-school.de

APRES TRAITEMENT - je voudrais obtenir :
@sfr.fr
[email protected]
[email protected]
@offreann.tqireireorhnotmonedn.fr
@isr-school.de
*/

Mammouth du PHP | 2680 Messages

15 août 2024, 09:45

vérifier avec des var_dump que les variables contiennent bien ce que vous croyez.

Avatar du membre
Mammouth du PHP | 1609 Messages

15 août 2024, 17:31

Salut, avec le fgets tu dois probablement avoir le retour à la ligne de la fin de chaque ligne ce qui fait que le domaine n'est pas reconnu (avec et sans retour à la ligne). Ajoute un trim autour du fgets et ça devrait aller mieux.
Développeur web depuis + de 20 ans

Avatar du membre
Petit nouveau ! | 3 Messages

17 août 2024, 07:29

Tu peux essayer quelque chose comme :
<?php
echo 'Avant traitement'.'<br>';

$fichier_lire = fopen('indesirables.txt', 'r');
$tab_lignes = [];

while ($ligne = fgets($fichier_lire)) {
    $ligne = trim($ligne); // Supprime les espaces et sauts de ligne superflus
    $tab_lignes[] = $ligne;
}

fclose($fichier_lire);

echo 'Après traitement'.'<br>';

$tab_except = array('azecris(.)fr', 'gmail(.)com'); // Sans les parenthèses sur les emails, c'est pour pouvoir écrire ce commentaire

foreach ($tab_lignes as $email) {
    list($prefixe, $domaine) = explode("@", $email, 2);
    
    if (in_array($domaine, $tab_except)) {
        echo $email; // Affiche l'email complet si le domaine est dans la liste des exceptions
    } else {
        echo "@".$domaine; // Sinon, affiche uniquement le domaine
    }
    echo '<br>';
}
?>
Cédric Chevillard
Créateur de site internet & Webmaster WordPress
\:D/

Eléphant du PHP | 65 Messages

17 août 2024, 13:44

Cédric,

Le résultat avec ton code est comme pour le mien.
Il ne prend pas en compte ceci :

Code : Tout sélectionner

if (in_array($domaine, $tab_except)) { echo $email;

Avatar du membre
Petit nouveau ! | 3 Messages

18 août 2024, 16:39

Peut-être que le problème vient du fait que le domaine extrait de l'email pourrait contenir des espaces ou des caractères invisibles, ce qui empêche la comparaison avec la liste $tab_except de fonctionner correctement...

Essaye d'ajouter un trim() autour du domaine pour nettoyer ces caractères superflus, et dis moi si c'est mieux :
// ....
list($prefixe, $domaine) = explode("@", $email, 2);
    
    $domaine = trim($domaine); // Assure que le domaine n'a pas de caractères superflus

    if (in_array($domaine, $tab_except)) {
        echo $email; // Affiche l'email complet si le domaine est dans la liste des exceptions
    } else {
// ...
Cédric Chevillard
Créateur de site internet & Webmaster WordPress
\:D/

Avatar du membre
Mammouth du PHP | 1525 Messages

22 août 2024, 22:07

L'utilisation de file() vous facilitera la vie : https://www.php.net/manual/fr/function.file.php
Utilisez les flags suivants dans votre cas : FILE_IGNORE_NEW_LINES et FILE_SKIP_EMPTY_LINES (au cas où il ligne du txt est vide)

Avatar du membre
Mammouth du PHP | 1609 Messages

23 août 2024, 15:08

L'utilisation de file() vous facilitera la vie : https://www.php.net/manual/fr/function.file.php
Utilisez les flags suivants dans votre cas : FILE_IGNORE_NEW_LINES et FILE_SKIP_EMPTY_LINES (au cas où il ligne du txt est vide)
Je cherchais cette fonction l'autre jour et je la retrouvais pas ! file tout simplement, du coup j'étais sur du explode trim file_get_contents. ^^
Développeur web depuis + de 20 ans