function glossaire_accents_callback($matches) { $u = unicode2charset($matches[0]); // charset $u2 = init_mb_string()?mb_strtoupper($u):strtoupper($u); // charset majuscule $u3 = htmlentities($u2, ENT_QUOTES, $GLOBALS['meta']['charset']); // html majuscule $u4 = html2unicode($u3); // unicode majuscule $a = array_unique(array($u, $u2, htmlentities($u, ENT_QUOTES, $GLOBALS['meta']['charset']), $u3, $matches[0], $u4)); // $a = array_unique(array($u, htmlentities($u, ENT_QUOTES, $GLOBALS['meta']['charset']), $matches[0])); return '(?:'.join('|', $a).')'; }
function rtl_visuel($texte, $rtl_global) { // hebreu + arabe: 54928 => 56767 // hebreu + presentation A: 15707294 => 15710140 // arabe presentation: 15708336 => 15711164 # echo hexdec("efb7bc"); // premiere passe pour determiner s'il y a du rtl // de facon a placer ponctuation et mettre les mots dans l'ordre $arabic_letters = array(array("ي", "ﻱ", "ﻳ", "ﻴ", "ﻲ"), array("ب", "ﺏ", "ﺑ", "ﺒ", "ﺐ"), array("ا", "ا", "ﺍ", "ﺍ", "ﺎ"), array("إ", "إ", "إ", "ﺈ", "ﺈ"), array("ل", "ﻝ", "ﻟ", "ﻠ", "ﻞ"), array("خ", "ﺥ", "ﺧ", "ﺨ", "ﺦ"), array("ج", "ﺝ", "ﺟ", "ﺠ", "ﺞ"), array("س", "ﺱ", "ﺳ", "ﺴ", "ﺲ"), array("ن", "ﻥ", "ﻧ", "ﻨ", "ﻦ"), array("ش", "ﺵ", "ﺷ", "ﺸ", "ﺶ"), array("ق", "ﻕ", "ﻗ", "ﻘ", "ﻖ"), array("ح", "ﺡ", "ﺣ", "ﺤ", "ﺢ"), array("م", "ﻡ", "ﻣ", "ﻤ", "ﻢ"), array("ر", "ر", "ﺭ", "ﺮ", "ﺮ"), array("ع", "ع", "ﻋ", "ﻌ", "ﻊ"), array("و", "و", "ﻭ", "ﻮ", "ﻮ"), array("ة", "ة", "ة", "ﺔ", "ﺔ"), array("ف", "ﻑ", "ﻓ", "ﻔ", "ﻒ"), array("ﻻ", "ﻻ", "ﻻ", "ﻼ", "ﻼ"), array("ح", "ﺡ", "ﺣ", "ﺤ", "ﺢ"), array("ت", "ﺕ", "ﺗ", "ﺘ", "ﺖ"), array("ض", "ﺽ", "ﺿ", "ﻀ", "ﺾ"), array("ك", "ك", "ﻛ", "ﻜ", "ﻚ"), array("ه", "ﻩ", "ﻫ", "ﻬ", "ﻪ"), array("ي", "ي", "ﻳ", "ﻴ", "ﻲ"), array("ئ", "ﺉ", "ﺋ", "ﺌ", "ﺊ"), array("ص", "ﺹ", "ﺻ", "ﺼ", "ﺺ"), array("ث", "ﺙ", "ﺛ", "ﺜ", "ﺚ"), array("ﻷ", "ﻷ", "ﻷ", "ﻸ", "ﻸ"), array("د", "ﺩ", "ﺩ", "ﺪ", "ﺪ"), array("ذ", "ﺫ", "ﺫ", "ﺬ", "ﺬ"), array("ط", "ﻁ", "ﻃ", "ﻄ", "ﻂ"), array("آ", "آ", "آ", "ﺂ", "ﺂ"), array("أ", "أ", "أ", "ﺄ", "ﺄ"), array("ؤ", "ؤ", "ؤ", "ﺆ", "ﺆ"), array("ز", "ز", "ز", "ﺰ", "ﺰ"), array("ظ", "ظ", "ﻇ", "ﻈ", "ﻆ"), array("غ", "غ", "ﻏ", "ﻐ", "ﻎ"), array("ى", "ى", "ﯨ", "ﯩ", "ﻰ"), array("پ", "پ", "ﭘ", "ﭙ", "ﭗ"), array("چ", "چ", "ﭼ", "ﭽ", "ﭻ")); if (init_mb_string() and mb_regex_encoding() !== "UTF-8") { echo "Attention: dans php.ini, il faut indiquer:<br /><strong>mbstring.internal_encoding = UTF-8</strong>"; } $texte = explode(" ", $texte); foreach ($texte as $mot) { $res = ""; // Inserer des indicateurs de debut/fin $mot = "^" . $mot . "^"; $mot = preg_replace(", ,u", " ", $mot); $mot = preg_replace(",«,u", "«", $mot); $mot = preg_replace(",»,u", "»", $mot); // ponctuations $ponctuations = array("/", "-", "«", "»", "“", "”", ",", ".", " ", ":", ";", "(", ")", "،", "؟", "?", "!", " "); foreach ($ponctuations as $ponct) { $mot = str_replace("{$ponct}", "^{$ponct}^", $mot); } // lettres forcant coupure $mot = preg_replace(",ا,u", "ا^", $mot); $mot = preg_replace(",د,u", "د^", $mot); $mot = preg_replace(",أ,u", "أ^", $mot); $mot = preg_replace(",إ,u", "إ^", $mot); $mot = preg_replace(",أ,u", "أ^", $mot); $mot = preg_replace(",ر,u", "ر^", $mot); $mot = preg_replace(",ذ,u", "ذ^", $mot); $mot = preg_replace(",ز,u", "ز^", $mot); $mot = preg_replace(",و,u", "و^", $mot); $mot = preg_replace(",و,u", "و^", $mot); $mot = preg_replace(",ؤ,u", "ؤ^", $mot); $mot = preg_replace(",ة,u", "ة^", $mot); // $mot = preg_replace(",ل,u", "^ل", $mot); // $mot = preg_replace(",,", "^", $mot); $mot = preg_replace(",٠,u", "^٠^", $mot); $mot = preg_replace(",١,u", "^١^", $mot); $mot = preg_replace(",٢,u", "^٢^", $mot); $mot = preg_replace(",٣,u", "^٣^", $mot); $mot = preg_replace(",٤,u", "^٤^", $mot); $mot = preg_replace(",٥,u", "^٥^", $mot); $mot = preg_replace(",٦,u", "^٦^", $mot); $mot = preg_replace(",٧,u", "^٧^", $mot); $mot = preg_replace(",٨,u", "^٨^", $mot); $mot = preg_replace(",٩,u", "^٩^", $mot); // Ligatures $mot = preg_replace(",لا,u", "ﻻ", $mot); $mot = preg_replace(",لأ,u", "ﻷ", $mot); foreach ($arabic_letters as $a_l) { $mot = preg_replace(",([^\\^])" . $a_l[0] . "([^\\^]),u", "\\1" . $a_l[3] . "\\2", $mot); $mot = preg_replace(",\\^" . $a_l[0] . "([^\\^]),u", "^" . $a_l[2] . "\\1", $mot); $mot = preg_replace(",([^\\^])" . $a_l[0] . "\\^,u", "\\1" . $a_l[4] . "^", $mot); // il semble qu'il ne soit pas necessaire de remplacer // la lettre isolee // $mot = preg_replace(",\^".$a_l[0]."\^,u", "^".$a_l[1]."^", $mot); } $mot = preg_replace(",\\^,u", "", $mot); $res = $mot; $res = rtl_reverse($mot, $rtl_global); /* $rtl = false; for ($i = 0; $i < spip_strlen($mot); $i++) { $lettre = spip_substr($mot, $i, 1); $code = rtl_mb_ord($lettre); if (($code >= 54928 && $code <= 56767) || ($code >= 15708336 && $code <= 15711164)) $rtl = true; } */ if ($rtl_global) { $retour = $res . " " . $retour; } else { $retour = $retour . " " . $res; } } return $retour; }
/** * Envoi d'un mail * * @param string $destinataire * @param string $sujet * @param string|array $corps * - au format string, c'est un corps d'email au format texte, comme supporte nativement par le core * - au format array, c'est un corps etendu qui peut contenir * - string texte : le corps d'email au format texte * - string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * - array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * - array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array : * - string chemin : chemin file system pour trouver le fichier a embarquer * - string nom : nom du document tel qu'apparaissant dans l'email * - string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable' * - string mime : mime type du document * --- Non implemente ici --- * - string html : le corps d'email au format html * - string nom_envoyeur : un nom d'envoyeur pour completer l'email from * - string cc : destinataires en copie conforme * - string bcc : destinataires en copie conforme cachee * - string adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = '', $headers = '') { if (!email_valide($destinataire)) { return false; } if ($destinataire == _T('info_mail_fournisseur')) { return false; } // tres fort // Fournir si possible un Message-Id: conforme au RFC1036, // sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER $email_envoi = $GLOBALS['meta']['email_envoi']; if (!email_valide($email_envoi)) { spip_log('Meta email_envoi invalide. Le mail sera probablement vu comme spam.'); $email_envoi = $destinataire; } $parts = ''; if (is_array($corps)) { $texte = $corps['texte']; $from = isset($corps['from']) ? $corps['from'] : $from; $headers = isset($corps['headers']) ? $corps['headers'] : $headers; if (is_array($headers)) { $headers = implode("\n", $headers); } if ($corps['pieces_jointes'] and function_exists('mail_embarquer_pieces_jointes')) { $parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']); } } else { $texte = $corps; } if (!$from) { $from = $email_envoi; } // ceci est la RegExp NO_REAL_NAME faisant hurler SpamAssassin if (preg_match('/^["\\s]*\\<?\\S+\\@\\S+\\>?\\s*$/', $from)) { $from .= ' (' . str_replace(')', '', translitteration(str_replace('@', ' at ', $from))) . ')'; } // nettoyer les é ’, &emdash; etc... // les 'cliquer ici' etc sont a eviter; voir: // http://mta.org.ua/spamassassin-2.55/stuff/wiki.CustomRulesets/20050914/rules/french_rules.cf $texte = nettoyer_caracteres_mail($texte); $sujet = nettoyer_caracteres_mail($sujet); // encoder le sujet si possible selon la RFC if (init_mb_string()) { # un bug de mb_string casse mb_encode_mimeheader si l'encoding interne # est UTF-8 et le charset iso-8859-1 (constate php5-mac ; php4.3-debian) $charset = $GLOBALS['meta']['charset']; mb_internal_encoding($charset); $sujet = mb_encode_mimeheader($sujet, $charset, 'Q', "\n"); mb_internal_encoding('utf-8'); } if (function_exists('wordwrap') && preg_match(',multipart/mixed,', $headers) == 0) { $texte = wordwrap($texte); } list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts); if (_OS_SERVEUR == 'windows') { $texte = preg_replace("@\r*\n@", "\r\n", $texte); $headers = preg_replace("@\r*\n@", "\r\n", $headers); $sujet = preg_replace("@\r*\n@", "\r\n", $sujet); } spip_log("mail {$destinataire}\n{$sujet}\n{$headers}", 'mails'); // mode TEST : forcer l'email if (defined('_TEST_EMAIL_DEST')) { if (!_TEST_EMAIL_DEST) { return false; } else { $texte = "Dest : {$destinataire}\r\n" . $texte; $destinataire = _TEST_EMAIL_DEST; } } return @mail($destinataire, $sujet, $texte, $headers); }
function spip_strlen($c) { // Si ce n'est pas utf-8, utiliser strlen if ($GLOBALS['meta']['charset'] != 'utf-8') return strlen($c); // Sinon, utiliser mb_strlen() si disponible if (init_mb_string()) return mb_strlen($c); // Methode manuelle : on supprime les bytes 10......, // on compte donc les ascii (0.......) et les demarrages // de caracteres utf-8 (11......) return strlen(preg_replace(',[\x80-\xBF],S', '', $c)); }
/** * Retourne la longueur d'une chaîne utf-8 * * Version utf-8 de strlen * * @param string $c * La chaîne à compter * @return int * Longueur de la chaîne */ function spip_strlen($c) { // On transforme les sauts de ligne pour ne pas compter deux caractères $c = str_replace("\r\n", "\n", $c); // Si ce n'est pas utf-8, utiliser strlen if ($GLOBALS['meta']['charset'] != 'utf-8') { return strlen($c); } // Sinon, utiliser mb_strlen() si disponible if (init_mb_string()) { return mb_strlen($c); } // Methode manuelle : on supprime les bytes 10......, // on compte donc les ascii (0.......) et les demarrages // de caracteres utf-8 (11......) return strlen(preg_replace(',[\\x80-\\xBF],S', '', $c)); }
function rtl_visuel($texte, $rtl_global) { // hebreu + arabe: 54928 => 56767 // hebreu + presentation A: 15707294 => 15710140 // arabe presentation: 15708336 => 15711164 # echo hexdec("efb7bc"); // premiere passe pour determiner s'il y a du rtl // de facon a placer ponctuation et mettre les mots dans l'ordre $arabic_letters = array( array("ي", // lettre 0 "ﻱ", // isolee 1 "ﻳ", // debut 2 "ﻴ", // milieu 3 "ﻲ"), array("ب", // lettre 0 "ﺏ", // isolee 1 "ﺑ", // debut 2 "ﺒ", // milieu 3 "ﺐ"), array("ا", // lettre 0 "ا", // isolee 1 "ﺍ", // debut 2 "ﺍ", // milieu 3 "ﺎ"), array("إ", // lettre 0 "إ", // isolee 1 "إ", // debut 2 "ﺈ", // milieu 3 "ﺈ"), array("ل", // lettre 0 "ﻝ", // isolee 1 "ﻟ", // debut 2 "ﻠ", // milieu 3 "ﻞ"), array("خ", // lettre 0 "ﺥ", // isolee 1 "ﺧ", // debut 2 "ﺨ", // milieu 3 "ﺦ"), array("ج", // lettre 0 "ﺝ", // isolee 1 "ﺟ", // debut 2 "ﺠ", // milieu 3 "ﺞ"), array("س", // lettre 0 "ﺱ", // isolee 1 "ﺳ", // debut 2 "ﺴ", // milieu 3 "ﺲ"), array("ن", // lettre 0 "ﻥ", // isolee 1 "ﻧ", // debut 2 "ﻨ", // milieu 3 "ﻦ"), array("ش", // lettre 0 "ﺵ", // isolee 1 "ﺷ", // debut 2 "ﺸ", // milieu 3 "ﺶ"), array("ق", // lettre 0 "ﻕ", // isolee 1 "ﻗ", // debut 2 "ﻘ", // milieu 3 "ﻖ"), array("ح", // lettre 0 "ﺡ", // isolee 1 "ﺣ", // debut 2 "ﺤ", // milieu 3 "ﺢ"), array("م", // lettre 0 "ﻡ", // isolee 1 "ﻣ", // debut 2 "ﻤ", // milieu 3 "ﻢ"), array("ر", // lettre 0 "ر", // isolee 1 "ﺭ", // debut 2 "ﺮ", // milieu 3 "ﺮ"), array("ع", // lettre 0 "ع", // isolee 1 "ﻋ", // debut 2 "ﻌ", // milieu 3 "ﻊ"), array("و", // lettre 0 "و", // isolee 1 "ﻭ", // debut 2 "ﻮ", // milieu 3 "ﻮ"), array("ة", // lettre 0 "ة", // isolee 1 "ة", // debut 2 "ﺔ", // milieu 3 "ﺔ"), array("ف", // lettre 0 "ﻑ", // isolee 1 "ﻓ", // debut 2 "ﻔ", // milieu 3 "ﻒ"), array("ﻻ", // lettre 0 "ﻻ", // isolee 1 "ﻻ", // debut 2 "ﻼ", // milieu 3 "ﻼ"), array("ح", // lettre 0 "ﺡ", // isolee 1 "ﺣ", // debut 2 "ﺤ", // milieu 3 "ﺢ"), array("ت", // lettre 0 "ﺕ", // isolee 1 "ﺗ", // debut 2 "ﺘ", // milieu 3 "ﺖ"), array("ض", // lettre 0 "ﺽ", // isolee 1 "ﺿ", // debut 2 "ﻀ", // milieu 3 "ﺾ"), array("ك", // lettre 0 "ك", // isolee 1 "ﻛ", // debut 2 "ﻜ", // milieu 3 "ﻚ"), array("ه", // lettre 0 "ﻩ", // isolee 1 "ﻫ", // debut 2 "ﻬ", // milieu 3 "ﻪ"), array("ي", // lettre 0 "ي", // isolee 1 "ﻳ", // debut 2 "ﻴ", // milieu 3 "ﻲ"), array("ئ", // lettre 0 "ﺉ", // isolee 1 "ﺋ", // debut 2 "ﺌ", // milieu 3 "ﺊ"), array("ص", // lettre 0 "ﺹ", // isolee 1 "ﺻ", // debut 2 "ﺼ", // milieu 3 "ﺺ"), array("ث", // lettre 0 "ﺙ", // isolee 1 "ﺛ", // debut 2 "ﺜ", // milieu 3 "ﺚ"), array("ﻷ", // lettre 0 "ﻷ", // isolee 1 "ﻷ", // debut 2 "ﻸ", // milieu 3 "ﻸ"), array("د", // lettre 0 "ﺩ", // isolee 1 "ﺩ", // debut 2 "ﺪ", // milieu 3 "ﺪ"), array("ذ", // lettre 0 "ﺫ", // isolee 1 "ﺫ", // debut 2 "ﺬ", // milieu 3 "ﺬ"), array("ط", // lettre 0 "ﻁ", // isolee 1 "ﻃ", // debut 2 "ﻄ", // milieu 3 "ﻂ"), array("آ", // lettre 0 "آ", // isolee 1 "آ", // debut 2 "ﺂ", // milieu 3 "ﺂ"), array("أ", // lettre 0 "أ", // isolee 1 "أ", // debut 2 "ﺄ", // milieu 3 "ﺄ"), array("ؤ", // lettre 0 "ؤ", // isolee 1 "ؤ", // debut 2 "ﺆ", // milieu 3 "ﺆ"), array("ز", // lettre 0 "ز", // isolee 1 "ز", // debut 2 "ﺰ", // milieu 3 "ﺰ"), array("ظ", // lettre 0 "ظ", // isolee 1 "ﻇ", // debut 2 "ﻈ", // milieu 3 "ﻆ"), array("غ", // lettre 0 "غ", // isolee 1 "ﻏ", // debut 2 "ﻐ", // milieu 3 "ﻎ"), array("ى", // lettre 0 "ى", // isolee 1 "ﯨ", // debut 2 "ﯩ", // milieu 3 "ﻰ"), array("پ", // lettre 0 "پ", // isolee 1 "ﭘ", // debut 2 "ﭙ", // milieu 3 "ﭗ"), array("چ", // lettre 0 "چ", // isolee 1 "ﭼ", // debut 2 "ﭽ", // milieu 3 "ﭻ") ); if(init_mb_string() AND mb_regex_encoding() !== "UTF-8") echo "Attention: dans php.ini, il faut indiquer:<br /><strong>mbstring.internal_encoding = UTF-8</strong>"; $texte = explode(" ", $texte); foreach ($texte as $mot) { $res = ""; // Inserer des indicateurs de debut/fin $mot = "^".$mot."^"; $mot = preg_replace(", ,u", " ", $mot); $mot = preg_replace(",«,u", "«", $mot); $mot = preg_replace(",»,u", "»", $mot); // ponctuations $ponctuations = array("/", "-", "«","»", "“", "”", ",", ".", " ", ":", ";", "(", ")", "،", "؟", "?", "!"," "); foreach($ponctuations as $ponct) { $mot = str_replace("$ponct", "^$ponct^", $mot); } // lettres forcant coupure $mot = preg_replace(",ا,u", "ا^", $mot); $mot = preg_replace(",د,u", "د^", $mot); $mot = preg_replace(",أ,u", "أ^", $mot); $mot = preg_replace(",إ,u", "إ^", $mot); $mot = preg_replace(",أ,u", "أ^", $mot); $mot = preg_replace(",ر,u", "ر^", $mot); $mot = preg_replace(",ذ,u", "ذ^", $mot); $mot = preg_replace(",ز,u", "ز^", $mot); $mot = preg_replace(",و,u", "و^", $mot); $mot = preg_replace(",و,u", "و^", $mot); $mot = preg_replace(",ؤ,u", "ؤ^", $mot); $mot = preg_replace(",ة,u", "ة^", $mot); // $mot = preg_replace(",ل,u", "^ل", $mot); // $mot = preg_replace(",,", "^", $mot); $mot = preg_replace(",٠,u", "^٠^", $mot); $mot = preg_replace(",١,u", "^١^", $mot); $mot = preg_replace(",٢,u", "^٢^", $mot); $mot = preg_replace(",٣,u", "^٣^", $mot); $mot = preg_replace(",٤,u", "^٤^", $mot); $mot = preg_replace(",٥,u", "^٥^", $mot); $mot = preg_replace(",٦,u", "^٦^", $mot); $mot = preg_replace(",٧,u", "^٧^", $mot); $mot = preg_replace(",٨,u", "^٨^", $mot); $mot = preg_replace(",٩,u", "^٩^", $mot); // Ligatures $mot = preg_replace(",لا,u", "ﻻ", $mot); $mot = preg_replace(",لأ,u", "ﻷ", $mot); foreach ($arabic_letters as $a_l) { $mot = preg_replace(",([^\^])".$a_l[0]."([^\^]),u", "\\1".$a_l[3]."\\2", $mot); $mot = preg_replace(",\^".$a_l[0]."([^\^]),u", "^".$a_l[2]."\\1", $mot); $mot = preg_replace(",([^\^])".$a_l[0]."\^,u", "\\1".$a_l[4]."^", $mot); // il semble qu'il ne soit pas necessaire de remplacer // la lettre isolee // $mot = preg_replace(",\^".$a_l[0]."\^,u", "^".$a_l[1]."^", $mot); } $mot = preg_replace(",\^,u", "", $mot); $res = $mot; $res = rtl_reverse($mot, $rtl_global); /* $rtl = false; for ($i = 0; $i < spip_strlen($mot); $i++) { $lettre = spip_substr($mot, $i, 1); $code = rtl_mb_ord($lettre); if (($code >= 54928 && $code <= 56767) || ($code >= 15708336 && $code <= 15711164)) $rtl = true; } */ if ($rtl_global) $retour = $res . " " . $retour; else $retour = $retour. " ".$res; } return $retour; }