Many UTF-8 fixes:
authorx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Fri, 2 Feb 2007 10:17:48 +0000 (10:17 +0000)
committerx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Fri, 2 Feb 2007 10:17:48 +0000 (10:17 +0000)
-> replace_accent and soundex_fr (remove the last dependence on Diogenes)
-> first XDB implementation using procedural mysqli
-> use Tidy 2.0
-> add the 'u' modifier on preg_ to catch multi-bytes characters
...

git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1461 839d8a87-29fc-0310-9880-83ba4fa771e5

25 files changed:
classes/platalpage.php
classes/plmailer.php
classes/session.php
classes/xdb.php
htdocs/.htaccess.in
htdocs/javascript/ajax.js
htdocs/javascript/close_on_esc.js
htdocs/javascript/do_challenge_response.js
htdocs/javascript/do_challenge_response_logged.js
htdocs/javascript/md5.js
htdocs/javascript/motdepasse.js
htdocs/javascript/overlib.js
htdocs/javascript/secure_hash.js
htdocs/javascript/sha1.js
htdocs/javascript/wiki.js
htdocs/javascript/xorg.js
include/globals.inc.php.in
include/massmailer.inc.php
include/url_catcher.inc.php
include/user.func.inc.php
include/xnet/session.inc.php
include/xorg.misc.inc.php
modules/search/classes.inc.php
modules/xnetgrp/mail.inc.php
plugins/block.tidy.php

index c07f6c6..dc75267 100644 (file)
@@ -264,8 +264,8 @@ function at_to_globals($tpl_source, &$smarty)
 function trimwhitespace($source, &$smarty)
 {
     $tags = '(script|pre|textarea)';
-    preg_match_all("!<$tags.*?>.*?</$tags>!is", $source, $tagsmatches);
-    $source = preg_replace("!<$tags.*?>.*?</$tags>!is", "&&&tags&&&", $source);
+    preg_match_all("!<$tags.*?>.*?</$tags>!ius", $source, $tagsmatches);
+    $source = preg_replace("!<$tags.*?>.*?</$tags>!ius", "&&&tags&&&", $source);
 
     // remove all leading spaces, tabs and carriage returns NOT
     // preceeded by a php close tag.
@@ -300,12 +300,12 @@ function hide_emails($source, &$smarty)
 {
     //prevent email replacement in <script> and <textarea>
     $tags = '(script|textarea|select)';
-    preg_match_all("!<$tags.*?>.*?</$tags>!is", $source, $tagsmatches);
-    $source = preg_replace("!<$tags.*?>.*?</$tags>!is", "&&&tags&&&", $source);
+    preg_match_all("!<$tags.*?>.*?</$tags>!ius", $source, $tagsmatches);
+    $source = preg_replace("!<$tags.*?>.*?</$tags>!ius", "&&&tags&&&", $source);
 
     //catch all emails in <a href="mailto:...">
-    preg_match_all("!<a[^>]+href=[\"'][^\"']*[-a-z0-9+_.]+@[-a-z0-9_.]+[^\"']*[\"'].*?>.*?</a>!is", $source, $ahref);
-    $source = preg_replace("!<a[^>]+href=[\"'][^\"']*[-a-z0-9+_.]+@[-a-z0-9_.]+[^\"']*[\"'].*?>.*?</a>!is", '&&&ahref&&&', $source);
+    preg_match_all("!<a[^>]+href=[\"'][^\"']*[-a-z0-9+_.]+@[-a-z0-9_.]+[^\"']*[\"'].*?>.*?</a>!ius", $source, $ahref);
+    $source = preg_replace("!<a[^>]+href=[\"'][^\"']*[-a-z0-9+_.]+@[-a-z0-9_.]+[^\"']*[\"'].*?>.*?</a>!ius", '&&&ahref&&&', $source);
 
     //prevant replacement in tag attributes
     preg_match_all("!<[^>]+[-a-z0-9_+.]+@[-a-z0-9_.]+.+?>!is", $source, $misc);
index 99d55f5..317dd64 100644 (file)
@@ -152,7 +152,7 @@ class PlMailer extends Mail_Mime {
     {
         $this->charset = $charset;
         $this->Mail_Mime("\n");
-        $this->mail = @Mail::factory('sendmail', Array('sendmail_args' => '-oi'));
+        $this->mail = Mail::factory('sendmail', Array('sendmail_args' => '-oi'));
         if (!is_null($tpl)) {
             $this->page =& PlMail::get($this, $tpl);
         }
@@ -163,7 +163,7 @@ class PlMailer extends Mail_Mime {
      */
     private function correct_emails($email)
     {
-        return preg_replace('!(^|, *)([^<"]+?) *(<[^>]*>)!', '\1"\2" \3', $email);
+        return preg_replace('!(^|, *)([^<"]+?) *(<[^>]*>)!u', '\1"\2" \3', $email);
     }
 
     public function addTo($email)
index 2ebaac2..004066e 100644 (file)
@@ -19,9 +19,6 @@
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-global $lc_accent, $lc_plain, $uc_accent, $uc_plain;
-require_once 'diogenes/diogenes.misc.inc.php';
-
 class Session
 {
     public static function init()
@@ -29,7 +26,7 @@ class Session
         @session_start();
         if (empty($_SESSION['challenge'])) {
             $_SESSION['challenge'] = sha1(uniqid(rand(), true));
-        }
+       }
     }
 
     public static function destroy()
index e66a0b3..3436fc7 100644 (file)
@@ -21,6 +21,7 @@
 
 class XDB
 {
+    public static $connec = null;
     var $_trace_data = array();
 
     public static function _prepare($args)
@@ -36,7 +37,7 @@ class XDB
         $length = 0;
         foreach ($query as $key=>$line) {
             $local = -2;
-            if (preg_match('/^([A-Z]+(?:\s+(?:JOIN|BY|FROM|INTO))?)\s+(.*)/', $line, $matches)
+            if (preg_match('/^([A-Z]+(?:\s+(?:JOIN|BY|FROM|INTO))?)\s+(.*)/u', $line, $matches)
             && $matches[1] != 'AND' && $matches[1] != 'OR')
             {
                 $local  = strlen($matches[1]);
@@ -59,28 +60,31 @@ class XDB
     {
         global $globals;
 
-        if ($globals->debug & 1) {
-            $_res = mysql_query("EXPLAIN $query");
+        if ($globals->debug & 1 && strpos($query, 'FOUND_ROWS()') === false) {
+            $_res = mysqli_query(XDB::$connec, "EXPLAIN $query");
             $explain = array();
-            while ($row = @mysql_fetch_assoc($_res)) {
+            while ($row = mysqli_fetch_assoc($_res)) {
                 $explain[] = $row;
             }
             $trace_data = array('query' => XDB::_reformatQuery($query), 'explain' => $explain);
-            @mysql_free_result($_res);
+            @mysqli_free_result($_res);
+            $time_start = microtime();
+        } elseif ($globals->debug & 1) {
+            $trace_data = array('query' =>  XDB::_reformatQuery($query), 'explain' => array());
             $time_start = microtime();
         }
 
-        $res = mysql_query($query);
-
+        $res = mysqli_query(XDB::$connec, $query);
+        
         if ($globals->debug & 1) {
             list($ue, $se) = explode(" ", microtime());
             list($us, $ss) = explode(" ", $time_start);
             $time = intval((($ue - $us) + ($se - $ss)) * 1000);            
-            $trace_data['error'] = mysql_error();
+            $trace_data['error'] = mysqli_error(XDB::$connec);
             $trace_data['exectime'] = $time;
-            $trace_data['rows'] = @mysql_num_rows() ? mysql_num_rows() : mysql_affected_rows();
+            $trace_data['rows'] = @mysqli_num_rows($res) ? mysqli_num_rows($res) : mysqli_affected_rows(XDB::$connec);
             $GLOBALS['XDB::trace_data'][] = $trace_data;
-            if (mysql_errno()) {
+            if (mysqli_errno(XDB::$connec)) {
                 $GLOBALS['XDB::error'] = true;
             }
         }
@@ -110,7 +114,7 @@ class XDB
 
     public static function insertId()
     {
-        return mysql_insert_id();
+        return mysqli_insert_id(XDB::$connec);
     }
 
     public static function _db_escape($var)
@@ -158,24 +162,24 @@ class XOrgDBResult
 
     function free()
     {
-        mysql_free_result($this->_res);
+        mysqli_free_result($this->_res);
         unset($this);
     }
 
     function _fetchRow()
     {
-        return mysql_fetch_row($this->_res);
+        return mysqli_fetch_row($this->_res);
     }
 
     function _fetchAssoc()
     {
-        return mysql_fetch_assoc($this->_res);
+        return mysqli_fetch_assoc($this->_res);
     }
 
     function fetchAllRow()
     {
         $result = Array();
-        while ($result[] = mysql_fetch_row($this->_res)) { }
+        while ($result[] = mysqli_fetch_row($this->_res)) { }
         array_pop($result);
         $this->free();
         return $result;
@@ -184,7 +188,7 @@ class XOrgDBResult
     function fetchAllAssoc()
     {
         $result = Array();
-        while ($result[] = mysql_fetch_assoc($this->_res)) { }
+        while ($result[] = mysqli_fetch_assoc($this->_res)) { }
         array_pop($result);
         $this->free();
         return $result;
@@ -229,7 +233,7 @@ class XOrgDBResult
 
     function numRows()
     {
-        return mysql_num_rows($this->_res);
+        return mysqli_num_rows($this->_res);
     }
 }
 
index 464189b..8d2c3bf 100644 (file)
@@ -1,4 +1,3 @@
-Options +FollowSymLinks
 RewriteEngine on
 
 RewriteBase @REWRITE_BASE@
index ca58777..e274892 100644 (file)
@@ -35,7 +35,7 @@ Ajax = {
                 }
             }
             if (Ajax.xml_client == null) {
-                alert("Ton client ne supporte pas Ajax, nécessaire pour certaines fonctionalités de cette page");
+                alert("Ton client ne supporte pas Ajax, nécessaire pour certaines fonctionalités de cette page");
             }
         }
         Ajax.init = true;
@@ -66,3 +66,4 @@ Ajax = {
     }
 }
 
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index b086c93..e8a490f 100644 (file)
@@ -27,3 +27,4 @@ function closePopup(e) {
 
 attachEvent(window, 'keydown', closePopup);
 
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index f7c1543..1219de1 100644 (file)
@@ -34,7 +34,7 @@ function correctUserName() {
     // jean paul dupont -> jean-paul.dupont
     if (mots.length == 3 && mots[0].toUpperCase() == 'JEAN') { u.value = mots[0]+"-"+mots[1]+"."+mots[2]; return true; }
     
-    alert('Ton email ne doit pas contenir de blanc.\nLe format standard est\n\nprenom.nom.promotion\n\nSi ton nom ou ton prenom est composé,\nsépare les mots par des -');
+    alert('Ton email ne doit pas contenir de blanc.\nLe format standard est\n\nprenom.nom.promotion\n\nSi ton nom ou ton prenom est composé,\nsépare les mots par des -');
 
     return false;
 }
@@ -59,3 +59,4 @@ function doChallengeResponse() {
     document.forms.loginsub.submit();
 
 }
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index a83a766..ea9f6e9 100644 (file)
@@ -46,3 +46,4 @@ function doChallengeResponse() {
     document.forms.login.password.value = "";
     document.forms.loginsub.submit();
 }
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index a7ea950..bd4ba66 100644 (file)
@@ -376,3 +376,4 @@ function MD5(entree)
  s=hexa(kd)+hexa(kc)+hexa(kb)+hexa(ka);
  return s; 
 }
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 6258362..52d9fcb 100644 (file)
@@ -27,7 +27,7 @@ function EnCryptedResponse() {
         exit;
     }
     if (pw1.length < 6) {
-        alert ("\nErreur : le nouveau mot de passe doit faire au moins 6 caractères !")
+        alert ("\nErreur : le nouveau mot de passe doit faire au moins 6 caractères !")
             return false;
         exit;
     }
@@ -35,7 +35,8 @@ function EnCryptedResponse() {
     str = hash_encrypt(document.forms.changepass.nouveau.value);
     document.forms.changepass2.response2.value = str;
 
-    alert ("Le mot de passe que tu as rentré va être chiffré avant de nous parvenir par Internet ! Ainsi il ne circulera pas en clair.");
+    alert ("Le mot de passe que tu as rentré va être chiffré avant de nous parvenir par Internet ! Ainsi il ne circulera pas en clair.");
     document.forms.changepass2.submit();
     return true;
 }
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 64aae53..0cab8d2 100644 (file)
@@ -1441,3 +1441,4 @@ registerHook("horizontalPlacement", horizontalPlacement, FCHAIN);
 registerHook("verticalPlacement", verticalPlacement, FCHAIN);\r
 if (olNs4||(olIe5&&isMac)||olKq) olLoaded=1;\r
 registerNoParameterCommands('sticky,autostatus,autostatuscap,fullhtml,hauto,vauto,closeclick,wrap,followmouse,mouseoff,compatmode');\r
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 5a9afb5..ca2445f 100644 (file)
@@ -48,3 +48,4 @@ function hash_xor(a, b) {
         c += a.charAt(k);\r
     return c;\r
 }\r
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 1b55982..a546ee3 100644 (file)
@@ -200,3 +200,4 @@ function binb2b64(binarray)
   }\r
   return str;\r
 }\r
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index b7c4306..d4e670e 100644 (file)
@@ -45,3 +45,4 @@ Nix = {
           }
 }
 
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 71d3dae..44c3291 100644 (file)
@@ -35,8 +35,8 @@ function getNow() {
     
     time   = (mi < 10) ? hr +':0'+mi : hr+':'+mi;
     days   = ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'];
-    months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet',
-           'août', 'septembre', 'octobre', 'novembre', 'décembre']
+    months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet',
+           'août', 'septembre', 'octobre', 'novembre', 'décembre']
 
     return days[dy]+' '+wd+' '+months[mh]+' '+yr+'<br />'+time;
 }
@@ -158,3 +158,4 @@ if (!attachEvent(window, 'load', auto_links)) {
 
 // }}}
 
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index 3a8b002..68cc164 100644 (file)
@@ -84,9 +84,9 @@ class PlatalGlobals
 
     function dbconnect()
     {
-        @mysql_connect($this->dbhost, $this->dbuser, $this->dbpwd);
-        @mysql_select_db($this->dbdb);
-        @mysql_query("SET NAMES 'utf8'");
+        XDB::$connec = @mysqli_connect($this->dbhost, $this->dbuser, $this->dbpwd);
+        @mysqli_select_db(XDB::$connec, $this->dbdb);
+        mysqli_set_charset(XDB::$connec, 'utf8');
     }
 
     function setlocale()
index bffe88e..fd5093d 100644 (file)
@@ -73,7 +73,7 @@ abstract class MassMailer
             return true;
         } else {
             $css = file_get_contents(dirname(__FILE__) . '/../htdocs/css/' . $this->_css);
-            return preg_replace('@/\*.*?\*/@s', '', $css);
+            return preg_replace('@/\*.*?\*/@us', '', $css);
         }
     }
 
index 5d49429..beff97c 100644 (file)
@@ -7,11 +7,11 @@ function url_catcher($texte, $mails = true) {
     $replacement = array();
 
     // url commencant par http, https ou ftp
-    $patterns[] = '/((?:https?|ftp):\/\/(?:\.*,*[\w@~%$£µ&i#\-+=_\/\?;])*)/i';
+    $patterns[] = '/((?:https?|ftp):\/\/(?:\.*,*[\w@~%$£µ&i#\-+=_\/\?;])*)/ui';
     $replacement[] = '<a href="\\0">\\0</a>';
 
     // url commencant par www.
-    $patterns[] = '/(\s|^)www\.((?:\.*,*[\w@~%$£µ&i#\-+=_\/\?;])*)/i';
+    $patterns[] = '/(\s|^)www\.((?:\.*,*[\w@~%$£µ&i#\-+=_\/\?;])*)/iu';
     $replacement[] = '\\1<a href="http://www.\\2">www.\\2</a>';
 
     if ($mails) {
index 5b40532..75f38c5 100644 (file)
@@ -106,7 +106,7 @@ function get_user_login($data, $get_forlife = false) {
             return $get_forlife ? $res->fetchOneCell() : $mbox;
         }
 
-        if (preg_match('/^(.*)\.([0-9]{4})$/', $mbox, $matches)) {
+        if (preg_match('/^(.*)\.([0-9]{4})$/u', $mbox, $matches)) {
             $res = XDB::query("SELECT  a.alias
                                  FROM  aliases AS a
                            INNER JOIN  aliases AS b ON (a.id = b.id AND b.type IN ('alias', 'a_vie') AND b.alias={?})
@@ -669,7 +669,7 @@ function set_user_details($uid, $details) {
     if (isset($details['gpxs']) && is_array($details['gpxs'])) {
         XDB::execute("DELETE FROM groupesx_ins WHERE user_id = {?}", $uid);
         foreach ($details['gpxs'] as $groupex) {
-            if (preg_match('/<a href="[^"]*">([^<]+)</a>/', $groupex, $a)) $groupex = $a[1];
+            if (preg_match('/<a href="[^"]*">([^<]+)</a>/u', $groupex, $a)) $groupex = $a[1];
             XDB::execute(
             "INSERT INTO groupesx_ins (`user_id`, `binet_id`)
                 SELECT {?}, id FROM groupesx_def WHERE text = {?} LIMIT 1",
index 3699b55..4a85ef8 100644 (file)
@@ -170,7 +170,7 @@ function may_update($force = false, $lose = false)
         $res = XDB::query("SELECT  perms
                              FROM  groupex.membres
                             WHERE  uid={?} AND asso_id={?}",
-                          S::v('uid'), $globals->asso('id'));
+                          S::v('uid'), $asso_id);
         $may_update[$asso_id] = ($res->fetchOneCell() == 'admin');
     }
     return $may_update[$asso_id];
index afcb63e..52faed6 100644 (file)
@@ -51,6 +51,18 @@ function quoted_printable_encode($input, $line_max = 76) {
     return trim($output);
 }
 
+/** vérifie si une adresse email est bien formatée
+ * ATTENTION, cette fonction ne doit pas être appelée sur une chaîne ayant subit un addslashes (car elle accepte le "'" qui rait alors un "\'"
+ * @param $email l'adresse email a verifier
+ * @return BOOL
+ */
+function isvalid_email($email) {
+  // la rfc2822 authorise les caractères "a-z", "0-9", "!", "#", "$", "%", "&", "'", "*", "+", "-", "/", "=", "?", "^", "_", `", "{", "|", "}", "~" aussi bien dans la partie locale que dans le domaine.
+  // Pour la partie locale, on réduit cet ensemble car il n'est pas utilisé.
+  // Pour le domaine, le système DNS limite à [a-z0-9.-], on y ajoute le "_" car il est parfois utilisé.
+  return preg_match("/^[a-z0-9_.'+-]+@[a-z0-9._-]+\.[a-z]{2,4}$/i", $email);
+}
+
 /** vérifie si une adresse email convient comme adresse de redirection 
  * @param $email l'adresse email a verifier
  * @return BOOL
@@ -60,6 +72,29 @@ function isvalid_email_redirection($email) {
        !preg_match("/@(polytechnique\.(org|edu)|melix\.(org|net)|m4x\.org)$/", $email);
 }
 
+/** Remove accent from a string and replace them by the nearest letter
+ */
+global $lc_convert, $uc_convert;
+$lc_convert = array('é' => 'e', 'è' => 'e', 'ë' => 'e', 'ê' => 'e',
+                    'á' => 'a', 'à' => 'a', 'ä' => 'a', 'â' => 'a', 'å' => 'a', 'ã' => 'a',
+                    'ï' => 'i', 'î' => 'i', 'ì' => 'i', 'í' => 'i',
+                    'ô' => 'o', 'ö' => 'o', 'ò' => 'o', 'ó' => 'o', 'õ' => 'o', 'ø' => 'o',
+                    'ú' => 'u', 'ù' => 'u', 'û' => 'u', 'ü' => 'u',
+                    'ç' => 'c', 'ñ' => 'n');
+$uc_convert = array('É' => 'E', 'È' => 'E', 'Ë' => 'E', 'Ê' => 'E', 
+                    'Á' => 'A', 'À' => 'A', 'Ä' => 'A', 'Â' => 'A', 'Å' => 'A', 'Ã' => 'A', 
+                    'Ï' => 'I', 'Î' => 'I', 'Ì' => 'I', 'Í' => 'I', 
+                    'Ô' => 'O', 'Ö' => 'O', 'Ò' => 'O', 'Ó' => 'O', 'Õ' => 'O', 'Ø' => 'O', 
+                    'Ú' => 'U', 'Ù' => 'U', 'Û' => 'U', 'Ü' => 'U', 
+                    'Ç' => 'C', 'Ñ' => 'N');
+
+function replace_accent($string)
+{
+    global $lc_convert, $uc_convert;
+    $string = strtr($string, $lc_convert);
+    return strtr($string, $uc_convert);
+}
+
 /* Un soundex en français posté par Frédéric Bouchery
    Voici une adaptation en PHP de la fonction soundex2 francisée de Frédéric BROUARD (http://sqlpro.developpez.com/Soundex/).
    C'est une bonne démonstration de la force des expressions régulières compatible Perl.
@@ -71,7 +106,11 @@ function soundex_fr($sIn)
     // On met tout en minuscule 
     $sIn = strtoupper( $sIn ); 
     // On supprime les accents 
-    $sIn = strtr( $sIn, 'ÂÄÀÇÈÉÊËŒÎÏÔÖÙÛÜ', 'AAASEEEEEIIOOUUU' ); 
+    global $uc_convert;
+    $accents = $uc_convert;
+    $accents['Ç'] = 'S';
+    $accents['¿'] = 'E';
+    $sIn = strtr( $sIn, $accents); 
     // On supprime tout ce qui n'est pas une lettre 
     $sIn = preg_replace( '`[^A-Z]`', '', $sIn ); 
     // Si la chaîne ne fait qu'un seul caractère, on sort avec. 
@@ -96,7 +135,7 @@ function soundex_fr($sIn)
     // suppression de tous les A sauf en tête 
     $sIn = preg_replace( '`(?!^)A`', '', $sIn ); 
     // on supprime les lettres répétitives 
-    $sIn = preg_replace( '`(.)\1`', '$1', $sIn ); 
+    $sIn = preg_replace( '`(.)\1`u', '$1', $sIn ); 
     // on ne retient que 4 caractères ou on complète avec des blancs 
     return substr( $sIn . '    ', 0, 4); 
 }
index db3c466..2ab4732 100644 (file)
@@ -221,7 +221,7 @@ class QuickSearch extends SField
     {
         $this->fieldFormName = $_fieldFormName;
         $this->get_request();
-        if (preg_match(":[\]\[{}~/§_`|%$^=+]|\*\*:", $this->value)) {
+        if (preg_match(":[\]\[{}~/§_`|%$^=+]|\*\*:u", $this->value)) {
             new ThrowError('Un champ contient un caractère interdit rendant la recherche impossible.');
         }
     }
@@ -501,7 +501,7 @@ class StringSField extends SField
     function get_request()
     {
         parent::get_request();
-        if (preg_match(":[\]\[<>{}~/§_`|%$^=+]|\*\*:", $this->value)) {
+        if (preg_match(":[\]\[<>{}~/§_`|%$^=+]|\*\*:u", $this->value)) {
             new ThrowError('Un champ contient un caractère interdit rendant la recherche impossible.');
         }
     }
@@ -514,8 +514,9 @@ class StringSField extends SField
      * imposées par l'utilisateur) */
     function length()
     {
-        global $lc_accent,$uc_accent;
-        return strlen($this->value) - strlen(ereg_replace('[a-z'.$lc_accent.$uc_accent.']', '', strtolower($this->value)));
+        $cleaned = replace_accent(strtolower($this->value));
+        $length  = strlen(ereg_replace('[a-z0-9]', '', $cleaned));
+        return strlen($this->value) - $length;
     }
 
     // }}}
index bdbbb71..3a51f5e 100644 (file)
@@ -80,7 +80,7 @@ function _send_xnet_mail($user, $body, $mailer, $replyto = null)
 {
     $cher = isset($user['sexe']) ? ($user['sexe'] ? 'Chère' : 'Cher') : 'Cher(e)';
     $nom  = isset($user['nom']) ? $user['nom'] : "";
-    $pnom = isset($user['prenom']) ? $user['prenom'] : preg_replace('!@.*!', '', $user['email']);
+    $pnom = isset($user['prenom']) ? $user['prenom'] : preg_replace('!@.*!u', '', $user['email']);
     $to   = isset($user['prenom']) ? "\"{$user['prenom']} {$user['nom']}\" <{$user['email']}>" : $user['email'];
     
     $text = $body;
index 13c20a4..20aeb0d 100644 (file)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-$tidy_on = Array(
-    'drop-empty-paras',
-    'drop-font-tags',
-    'drop-proprietary-attributes',
-    'hide-comments',
-    'logical-emphasis',
-    'output-xhtml',
-    'replace-color',
-    'show-body-only'
-);
-$tidy_off = Array(
-    'clean',
-    'join-styles',
-    'join-classes'
-);
-
-foreach($tidy_on as $opt) { tidy_setopt($opt, true); }
-foreach($tidy_off as $opt) { tidy_setopt($opt, false); }
-tidy_setopt('alt-text', '[ inserted by TIDY ]');
-tidy_setopt('wrap', '120');
-tidy_set_encoding('utf8');
-unset($tidy_o, $tydy_off);
+global $tidy_config;
+$tidy_config = array(
+    'drop-empty-paras' => true,
+    'drop-font-tags' => true,
+    'drop-proprietary-attributes' => true,
+    'hide-comments' => true,
+    'logical-emphasis' => true,
+    'output-xhtml' => true,
+    'replace-color' => true,
+    'show-body-only' => true,
+    'clean' => false,
+    'join-styles' => false,
+    'join-classes' => false,
+    'alt-text' => '[ inserted by TIDY ]',
+    'wrap' => '120');
 
 /*
  * Smarty plugin
@@ -53,7 +46,8 @@ unset($tidy_o, $tydy_off);
  */
 function smarty_block_tidy($params, $content, &$smarty)
 {
-    return tidy_repair_string($content);
+    global $tidy_config;
+    return tidy_repair_string($content, $tidy_config, 'utf8');
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: