Bonjour à tous,

C'est mon premier message sur les forums d'Alsacréations et j'espère pouvoir y trouver de l'aide.

J'ai récupéré et adapter le code d'un formulaire mais qui me pose un problème au niveau des caractères puisque des accents contenus dans le champ "Nom" bloque l'envoi du mail.

Le filtre FILTER_SANITIZE_STRING est bien en place mais il ne permet pas de traiter les accents.
Je n'ai pas vu non plus d'autres filtres qui permettent de le faire.

Pour garder de la souplesse pour les utilisateurs, j'aimerai que les caractères avec accents soient remplacés par le caractère directement et ce, avant l'envoi du formulaire.

Le code en question :
<?php
if($_POST)
{
require('constant.php');
    
    $user_name      = filter_var($_POST["name"], FILTER_SANITIZE_STRING);
    $user_email     = filter_var($_POST["email"], FILTER_SANITIZE_EMAIL);
    $user_phone     = filter_var($_POST["phone"], FILTER_SANITIZE_STRING);
    $content   = filter_var($_POST["content"], FILTER_SANITIZE_STRING);
    
    if(empty($user_name)) {
		$empty[] = "<b>Nom</b>";		
	}
	if(empty($user_email)) {
		$empty[] = "<b>Email</b>";
	}
	if(empty($user_phone)) {
		$empty[] = "<b>Sujet</b>";
	}	
	if(empty($content)) {
		$empty[] = "<b>Message</b>";
	}
	
	if(!empty($empty)) {
		$output = json_encode(array('type'=>'error', 'text' => implode(", ",$empty) . ' <b>manquant(s)</b>'));
        die($output);
	}
	
	if(!filter_var($user_email, FILTER_VALIDATE_EMAIL)){ //email validation
	    $output = json_encode(array('type'=>'error', 'text' => '<b>'.$user_email.'</b> est un e-mail non valide. Merci de le corriger.'));
		die($output);
	}
	
	//reCAPTCHA validation
	if (isset($_POST['g-recaptcha-response'])) {
		
		require('component/recaptcha/src/autoload.php');		
		
		$recaptcha = new \ReCaptcha\ReCaptcha(SECRET_KEY, new \ReCaptcha\RequestMethod\SocketPost());

		$resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);

		  if (!$resp->isSuccess()) {
				$output = json_encode(array('type'=>'error', 'text' => '<b>Alerte Captcha : Validation nécessaire !</b> '));
				die($output);				
		  }	
	}
    
	$toEmail = "contact@locationsaintcoulomb.fr";
	$mailHeaders = "From : " . $user_name . "<" . $user_email . ">\r\n";
	$mailBody = "Nom : " . $user_name . "\n";
	$mailBody .= "Email : " . $user_email . "\n";
	$mailBody .= "Sujet : " . $user_phone . "\n";
	$mailBody .= "Message : " . $content . "\n";

	if (mail($toEmail, "Message de  www.locationsaintcoulomb.fr",  $mailBody, $mailHeaders)) {
	    $output = json_encode(array('type'=>'message', 'text' => 'Bonjour '.$user_name .', merci pour votre e-mail. Nous reviendrons vers vous dès que possible.'));
	    die($output);
	} else {
	    $output = json_encode(array('type'=>'error', 'text' => 'Cet e-mail ne peut être envoyé. Merci de contacter'.SENDER_EMAIL));
	    die($output);
	}
}
?>


Et le script Ajax au besoin :
$(document).ready(function (e){
		$("#frmContact").on('submit',(function(e){
			e.preventDefault();
			$("#mail-status").hide();
			$('#send-message').hide();
			$('#loader-icon').show();
			$.ajax({
				url: "contact_check.php",
				type: "POST",
				dataType:'json',
				data: {
				"name":$('input[name="name"]').val(),
				"email":$('input[name="email"]').val(),
				"phone":$('input[name="phone"]').val(),
				"content":$('textarea[name="content"]').val(),
				"g-recaptcha-response":$('textarea[id="g-recaptcha-response"]').val()},				
				success: function(response){
				$("#mail-status").show();
				$('#loader-icon').hide();
				if(response.type == "error") {
					$('#send-message').show();
					$("#mail-status").attr("class","error");				
				} else if(response.type == "message"){
					$('#send-message').hide();
					$("#mail-status").attr("class","success");							
				}
				$("#mail-status").html(response.text);	
				},
				error: function(){} 
			});
		}));
	});


Cela doit forcément passer par une fonction php mais je ne suis pas capable de l'écrire ni de l'insérer correctement dans mon code d'origine.

Merci d'avance. Smiley biggrin
Modérateur
Et l'eau,

C'est un problème de header. Il est incomplet.... Tu n'as pas besoin de transpiler tes chaines de caractères lorsque tu es en utf-8.
Merci niuxe pour ton retour.
J'ai modifié le header en uft-8 mais le problème perdure.

(Du coup, comme certains caractères n'étaient plus lisible dans ma page, je me suis remis en iso-8859-1)
Modérateur
sokratt a écrit :
Merci niuxe pour ton retour.
J'ai modifié le header en uft-8 mais le problème perdure.

(Du coup, comme certains caractères n'étaient plus lisible dans ma page, je me suis remis en iso-8859-1)


Dans ce cas, utilise htmlentities()
bonjour Sokratt,
Perso j'utilise une fonction php pour supprimer les accents lors de l'envoi de données vers la db.
voici la fonction ...

//Remplace les caractères accentués
function str_to_noaccent($str)
{
    $url = $str;
    $url = preg_replace('#Ç#', 'C', $url);
    $url = preg_replace('#ç#', 'c', $url);
    $url = preg_replace('#è|é|ê|ë#', 'e', $url);
    $url = preg_replace('#È|É|Ê|Ë#', 'E', $url);
    $url = preg_replace('#à|á|â|ã|ä|å#', 'a', $url);
    $url = preg_replace('#@|À|Á|Â|Ã|Ä|Å#', 'A', $url);
    $url = preg_replace('#ì|í|î|ï#', 'i', $url);
    $url = preg_replace('#Ì|Í|Î|Ï#', 'I', $url);
    $url = preg_replace('#ð|ò|ó|ô|õ|ö#', 'o', $url);
    $url = preg_replace('#Ò|Ó|Ô|Õ|Ö#', 'O', $url);
    $url = preg_replace('#ù|ú|û|ü#', 'u', $url);
    $url = preg_replace('#Ù|Ú|Û|Ü#', 'U', $url);
    $url = preg_replace('#ý|ÿ#', 'y', $url);
    $url = preg_replace('#Ý#', 'Y', $url);

    return ($url);
}


Lors de l'envoi des données, je l'utilise comme ceci....

$texte2 = str_to_noaccent($_POST['libelle2']);


j'espère avoir pu apporter de l'aide à ton moulin.
Plus généralement, tous les caractères avec accents, cédilles et autres signes utilisés dans les langues utilisant une variante quelconque de l'alphabet latin (roumain, tchèque, polonais...) peuvent être convertis en caractères ASCII par la fonctions suivante

function toPlainASCII($text) {
	return iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", transliterator_transliterate('Any-Latin; Latin-ASCII', $text));
}