PEEL Shopping
Open source ecommerce : PEEL Shopping
String.php
Go to the documentation of this file.
1 <?php
2 // This file should be in UTF8 without BOM - Accents examples: éèê
3 // +----------------------------------------------------------------------+
4 // | Copyright (c) 2004-2015 Advisto SAS, service PEEL - contact@peel.fr |
5 // +----------------------------------------------------------------------+
6 // | This file is part of PEEL Shopping 8.0.0, which is subject to an |
7 // | opensource GPL license: you are allowed to customize the code |
8 // | for your own needs, but must keep your changes under GPL |
9 // | More information: https://www.peel.fr/lire/licence-gpl-70.html |
10 // +----------------------------------------------------------------------+
11 // | Author: Advisto SAS, RCS 479 205 452, France, https://www.peel.fr/ |
12 // +----------------------------------------------------------------------+
13 // $Id: String.php 46935 2015-09-18 08:49:48Z gboussin $
14 if (!defined('IN_PEEL')) {
15  die();
16 }
17 
18 $GLOBALS['ucfirsts'] = array('zh' => false, 'ja' => false);
19 
29 class String {
36  public static function strlen($string)
37  {
38  if (function_exists('mb_strlen') && GENERAL_ENCODING != 'iso-8859-1') {
39  return mb_strlen($string);
40  } else {
41  return strlen($string);
42  }
43  }
44 
54  public static function strpos($haystack, $needle, $offset = 0)
55  {
56  if($needle!=='' && $needle!== null) {
57  if (function_exists('mb_strpos')) {
58  return mb_strpos($haystack, $needle, $offset);
59  } else {
60  return strpos($haystack, $needle, $offset);
61  }
62  } else {
63  return false;
64  }
65  }
66 
76  public static function strrpos($haystack, $needle, $offset = 0)
77  {
78  if ($offset > 0) {
79  $offset = min($offset, String::strlen($haystack));
80  } elseif ($offset < 0) {
81  $offset = max($offset, - String::strlen($haystack));
82  }
83  if (function_exists('mb_strrpos')) {
84  if (empty($offset)) {
85  return mb_strrpos($haystack, $needle);
86  } elseif (version_compare(PHP_VERSION, '5.2.0', '>=')) {
87  // $offset pour mb_strrpos est introduit avec PHP 5.2
88  return mb_strrpos($haystack, $needle, $offset);
89  } elseif (version_compare(PHP_VERSION, '5.0.0', '>=')) {
90  // $offset pour strrpos est introduit avec PHP 5 et non pas 5.2
91  return strrpos($haystack, $needle, $offset);
92  } else {
93  return false;
94  }
95  } else {
96  if (empty($offset)) {
97  return strrpos($haystack, $needle);
98  } else {
99  return strrpos($haystack, $needle, $offset);
100  }
101  }
102  }
103 
112  public static function substr($string, $start, $length = null)
113  {
114  if (function_exists('mb_substr')) {
115  if ($length !== null) {
116  return mb_substr($string, $start, $length);
117  } else {
118  return mb_substr($string, $start);
119  }
120  } else {
121  if ($length !== null) {
122  return substr($string, $start, $length);
123  } else {
124  return substr($string, $start);
125  }
126  }
127  }
128 
135  public static function strtolower($string)
136  {
137  if(empty($GLOBALS['site_parameters']['string_case_change_forbidden']) || empty($GLOBALS['site_parameters']['string_case_change_forbidden'][$_SESSION['session_langue']])) {
138  if (function_exists('mb_strtolower')) {
139  return mb_strtolower($string);
140  } else {
141  return strtolower($string);
142  }
143  } else {
144  return $string;
145  }
146  }
147 
154  public static function strtoupper($string)
155  {
156  if(empty($GLOBALS['site_parameters']['string_case_change_forbidden']) || empty($GLOBALS['site_parameters']['string_case_change_forbidden'][$_SESSION['session_langue']])) {
157  if (function_exists('mb_strtoupper')) {
158  return mb_strtoupper($string);
159  } else {
160  return strtoupper($string);
161  }
162  } else {
163  return $string;
164  }
165  }
166 
173  public static function ucfirst($string)
174  {
175  if(empty($GLOBALS['site_parameters']['string_case_change_forbidden']) || empty($GLOBALS['site_parameters']['string_case_change_forbidden'][$_SESSION['session_langue']])) {
176  if (function_exists('mb_ucfirst')) {
177  return mb_ucfirst($string);
178  } else {
179  return String::strtoupper(String::substr($string, 0, 1)) . String::substr($string, 1);
180  }
181  } else {
182  return $string;
183  }
184  }
185 
194  public static function substr_count($string, $searched)
195  {
196  if (function_exists('mb_substr_count')) {
197  return mb_substr_count($string, $searched);
198  } else {
199  return substr_count($string, $searched);
200  }
201  }
202 
211  public static function cut_with_separator($string, $max_part_length = 40, $separator = ' ')
212  {
213  $left_string = '';
214  $right_string = $string;
215  while(String::strlen($right_string)>$max_part_length) {
216  // On évite de faire une fonction récursive pour meilleure performance => on fait une boucle
217  $left_string .= String::substr($right_string, 0, $max_part_length) . $separator;
218  $right_string = String::substr($right_string, $max_part_length);
219  }
220  return $left_string.$right_string;
221  }
222 
233  public static function str_shorten($string, $length_limit, $middle_separator = '', $ending_if_no_middle_separator = '...', $ideal_length_with_clean_cut_if_possible = null)
234  {
235  $length = String::strlen($string);
236  if (!empty($ideal_length_with_clean_cut_if_possible) && $length > $ideal_length_with_clean_cut_if_possible) {
237  // Gestion d'une coupure propre si possible entre $ideal_length_with_clean_cut_if_possible et $length_limit
238  $middle_separator = null;
239  foreach(array('.', '!', '?', ';', ':', ',', ' ', '=', '+', '-', '{', '}', '[', ']', '(', ')', '<', '>', '_', '#', '*') as $this_separator) {
240  // On fait un test sur les séparateurs, du plus important au moins important
241  $possible_cut = String::strpos($string, $this_separator, $ideal_length_with_clean_cut_if_possible);
242  if ($possible_cut !== false && $possible_cut < $length_limit - String::strlen($ending_if_no_middle_separator)) {
243  // On prend cette valeur comme étant la limite de coupure à faire
244  $length_limit = $possible_cut + String::strlen($ending_if_no_middle_separator);
245  // Cette gestion a la priorité sur une coupure au milieu
246  $middle_separator = null;
247  // On s'arrête car on a trouvé une coupure convenable
248  break;
249  }
250  }
251  }
252  if (!empty($middle_separator)) {
253  $ending = '';
254  } else {
255  $ending = $ending_if_no_middle_separator;
256  }
257  if (String::strlen($middle_separator) + String::strlen($ending) >= $length_limit) {
258  // CAS PARTICULIER (protection) : Dans le cas où la largeur max est inférieur à la largeur du séparateur, on coupe simplement la chaîne à la longueur max
259  return String::substr($string, 0, $length_limit);
260  } elseif ($length > $length_limit) {
261  // $cut_size est le nombre de caractères à retirer
262  $cut_size = $length + String::strlen($middle_separator) + String::strlen($ending) - $length_limit;
263  if (!empty($middle_separator)) {
264  // On coupe au milieu
265  $cut_start = ceil(($length - $cut_size) / 2);
266  $ending_text = String::substr($string, $cut_start + $cut_size);
267  if (String::strpos(String::substr($ending_text, 0, 8), '&') === false && String::strpos(String::substr($ending_text, 0, 8), ';') !== false) {
268  // Si le texte de fin commence par un morceau de fin d'entité, alors on retire ce morceau.
269  $ending_text = String::substr($ending_text, String::strpos($ending_text, ';') + 1);
270  }
271  if (String::strpos(String::substr($ending_text, - 8), '&') !== false && String::strpos(String::substr($ending_text, - 8), ';') === false) {
272  // Si le texte se termine par une entité pas finie (ex : &#34) on la retire.
273  $ending_text = String::substr($ending_text, 0, String::strrpos($ending_text, '&'));
274  }
275  } else {
276  // On coupe à la fin de la chaine
277  $cut_start = $length - $cut_size;
278  $ending_text = '';
279  }
280  $beginning_text = String::substr($string, 0, $cut_start);
281  if (String::strpos(String::substr($beginning_text, - 8), '&') !== false && String::strpos(String::substr($beginning_text, - 8), ';') === false) {
282  // Si le texte se termine par une entité pas finie (ex : &#34) on la retire.
283  $beginning_text = String::substr($beginning_text, 0, String::strrpos($beginning_text, '&'));
284  }
285  $string = $beginning_text . $middle_separator . $ending_text . $ending;
286  while (String::substr_count($string, '(') > String::substr_count($string, ')')) {
287  // Si le texte coupé a des parenthèses fermantes manquantes
288  $string .= ')';
289  }
290  return $string;
291  } else {
292  return $string;
293  }
294  }
295 
305  public static function str_shorten_words($string, $length_limit = 100, $separator = " ", $force_shorten_if_special_content = false, $add_separator_instead_of_cutting = true)
306  {
307  // On coupe autour de tous les mots
308  $sentences_array = explode("\n", $string);
309  foreach($sentences_array as $this_main_sentence_key => $this_main_sentence) {
310  $string_array = explode("\t", $this_main_sentence);
311  foreach($string_array as $this_main_key => $this_main_string) {
312  $tab = explode(' ', $this_main_string);
313  foreach($tab as $key => $this_string) {
314  // "quote=" => Compatibilité avec les enchaînements de quote dans lesquels il n'y a pas d'espace
315  // On met une condition strlen (et non pas String::strlen) pour aller plus rapide
316  if (strlen($this_string) > $length_limit && ($force_shorten_if_special_content || (String::strpos($this_string, 'http') === false && String::strpos($this_string, 'quote=') === false && String::strpos($this_string, '[/quote]') === false && String::strpos($this_string, '&#') === false))) {
317  if($add_separator_instead_of_cutting) {
318  $tab[$key] = String::cut_with_separator($this_string, $length_limit, $separator);
319  } else {
320  $tab[$key] = String::str_shorten($this_string, $length_limit, $separator, null, null);
321  }
322  }
323  }
324  $string_array[$this_main_key] = implode(' ', $tab);
325  }
326  // on reconstitue la chaîne initiale
327  $sentences_array[$this_main_sentence_key] = implode("\t", $string_array);
328  }
329  $string = implode("\n", $sentences_array);
330  return $string;
331  }
332 
341  public static function convert_accents($string, $convert_umlaut = false, $strip_umlaut = true)
342  {
343  $string = str_replace(array('à', 'á', 'â', 'ã', 'å'), 'a', $string);
344  $string = str_replace(array('À', 'Á', 'Â', 'Ã', 'Å'), 'A', $string);
345  $string = str_replace(array('è', 'é', 'ê', 'ë'), 'e' , $string);
346  $string = str_replace(array('È', 'É', 'Ê', 'Ë'), 'E' , $string);
347  $string = str_replace(array('ì', 'í', 'î', 'ï'), 'i' , $string);
348  $string = str_replace(array('Ì', 'Í', 'Î', 'Ï'), 'I' , $string);
349  $string = str_replace(array('ò', 'ó', 'ô', 'õ', 'ø'), 'o' , $string);
350  $string = str_replace(array('Ò', 'Ó', 'Ô', 'Õ', 'Ø'), 'O' , $string);
351  $string = str_replace(array('ù', 'ú', 'û'), 'u' , $string);
352  $string = str_replace(array('Ù', 'Ú', 'Û'), 'U' , $string);
353  $string = str_replace(array('æ', 'œ', 'ý', 'ÿ', 'ç', 'ß', 'ñ'), array('ae', 'oe', 'y', 'y', 'c', 'ss', 'n'), $string);
354  $string = str_replace(array('Æ', 'Œ', 'Ý', 'Ÿ', 'Ç', 'ß', 'Ñ'), array('AE', 'OE', 'Y', 'Y', 'C', 'SS', 'N'), $string);
355  if ($convert_umlaut) {
356  $string = str_replace(array('ä', 'ö', 'ü'), array('ae', 'oe', 'ue'), $string);
357  $string = str_replace(array('Ä', 'Ö', 'Ü'), array('AE', 'OE', 'UE'), $string);
358  } elseif ($strip_umlaut) {
359  $string = str_replace(array('ä', 'ö', 'ü'), array('a', 'o', 'u'), $string);
360  $string = str_replace(array('Ä', 'Ö', 'Ü'), array('A', 'O', 'U'), $string);
361  }
362  return $string;
363  }
364 
375  public static function convert_encoding($string, $new_encoding, $original_encoding = null)
376  {
377  $new_encoding = strtolower($new_encoding);
378  $original_encoding = strtolower($original_encoding);
379  if (empty($original_encoding)) {
380  $original_encoding = GENERAL_ENCODING;
381  }
382  // Le sigle euro n'est pas dans iso-8859-1, et par ailleurs iso-8859-15 n'est pas sur
383  // tous les serveurs => on va donc contourner le problème.
384  if ($new_encoding == $original_encoding) {
385  return $string;
386  } elseif ($new_encoding == 'iso-8859-1' && $original_encoding == 'utf-8') {
387  $euro_iso = mb_convert_encoding('€', "CP1252", 'utf-8');
388  return str_replace('-,/)[_', $euro_iso, utf8_decode(str_replace('€', '-,/)[_', $string)));
389  } elseif ($new_encoding == 'utf-8' && $original_encoding == 'iso-8859-1') {
390  return String::utf8_encode($string);
391  } elseif (function_exists('mb_convert_encoding') && (!function_exists('mb_list_encodings') || (in_array(String::strtoupper($new_encoding), mb_list_encodings()) && in_array(String::strtoupper($original_encoding), mb_list_encodings())))) {
392  return mb_convert_encoding($string, $new_encoding, $original_encoding);
393  } else {
394  return $string;
395  }
396  }
397 
411  public static function htmlentities ($string, $flags = ENT_COMPAT, $charset = GENERAL_ENCODING, $suppr_endline = false, $encode_only_isolated_amperstands = false, $decode_html_entities_first = false)
412  {
413  if ($suppr_endline) {
414  $string = str_replace(array("\r", "\n"), ' ', $string);
415  }
416  if ($decode_html_entities_first) {
417  $string = html_entity_decode ($string, $flags, $charset);
418  }
419  // On retire des caractères non SGML
420  $string = str_replace(array('•', '™', '€', '’'), array('', '', '&euro;', "'"), $string);
421  if ($encode_only_isolated_amperstands) {
422  // On en remplace que les & qui sont tout seuls. On ne touche pas au reste
423  // ?! => assertion négative (et comme c'est une assertion, ça ne rentre pas de le résultat)
424  $string = str_replace('&amp;amp;', '&amp;', preg_replace('/&(?!#?[xX]?([0-9a-zA-Z]{1,9});)/', '&amp;', $string));
425  } else {
426  // On encode les entités, mais si il y en avait déjà, dans ce cas on se retrouverait avec une entité du type &amp;entité;
427  // => On reconstruit donc ensuite les entités qui auraient été cassées grave au preg_replace
428  // ?= => assertion positive (et comme c'est une assertion, ça ne rentre pas de le résultat)
429  $string = preg_replace('/&amp;(?=#?[xX]?([0-9a-zA-Z]{1,9});)/', '&', htmlentities($string, $flags, $charset));
430  }
431  // Si le stringe se termine par une entité pas finie (ex : &#34) on la retire.
432  // NB : comme l'entité n'est pas finie, on ne l'a pas détectée dans les preg_replace, donc elle est sous la forme &amp;#
433  if (String::strpos($string, '&amp;#') !== false && String::strpos($string, '&amp;#') >= String::strlen($string) - 9) {
434  if (String::substr($string, String::strlen($string) - 6, 6) == '&amp;#') {
435  $string = String::substr($string, 0, String::strlen($string) - 6);
436  } elseif (String::substr($string, String::strlen($string) - 7, 6) == '&amp;#') {
437  $string = String::substr($string, 0, String::strlen($string) - 7);
438  } elseif (String::substr($string, String::strlen($string) - 8, 6) == '&amp;#' && String::strpos(String::substr($string, String::strlen($string) - 8), ';') === false) {
439  $string = String::substr($string, 0, String::strlen($string) - 8);
440  } elseif (String::substr($string, String::strlen($string) - 9, 6) == '&amp;#' && String::strpos(String::substr($string, String::strlen($string) - 9), ';') === false) {
441  $string = String::substr($string, 0, String::strlen($string) - 8);
442  }
443  }
444  return $string;
445  }
446 
455  public static function str_htmlentities($string, $suppr_endline = false, $encode_only_isolated_amperstands = false)
456  {
457  return String::htmlentities($string, ENT_COMPAT, GENERAL_ENCODING, $suppr_endline, $encode_only_isolated_amperstands);
458  }
459 
468  public static function textEncode($string, $suppr_endline = false, $encode_only_isolated_amperstands = false)
469  {
470  return String::htmlentities($string, ENT_COMPAT, GENERAL_ENCODING, $suppr_endline, $encode_only_isolated_amperstands);
471  }
472 
480  public static function str_form_value($value, $flags = ENT_COMPAT)
481  {
482  if (function_exists('html_entity_decode') && (version_compare(PHP_VERSION, '5.0.0', '>=') || GENERAL_ENCODING == 'iso-8859-1')) {
483  // Le 4è argument de htmlspecialchars appelé $double_encode n'est pas disponible avant PHP 5.2.3
484  // Il faut donc appeler htmlentities_decode d'abord pour éviter le double encodage des entités HTML
485  return @htmlspecialchars(String::html_entity_decode($value, ENT_QUOTES, GENERAL_ENCODING), $flags, GENERAL_ENCODING);
486  } else {
487  // Version simplifiée si PHP < 4.3
488  // ou si PHP >=4.3 et <5 car sinon pas de support de UTF-8
489  return str_replace('"', '&quot;', $value);
490  }
491  }
492 
500  public static function htmlspecialchars_decode($string, $style = ENT_COMPAT)
501  {
502  $translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS, $style));
503  if ($style === ENT_QUOTES) {
504  $translation['&#039;'] = '\'';
505  }
506  return strtr($string, $translation);
507  }
508 
517  public static function html_entity_decode($string, $quote_style = ENT_COMPAT, $charset = GENERAL_ENCODING)
518  {
519  if (version_compare(PHP_VERSION, '5.0.0', '>=')) {
520  return html_entity_decode($string, $quote_style, $charset);
521  } else {
522  // Nécessaire pour éviter le bogue : "Warning: cannot yet handle MBCS in html entity decode"
523  return html_entity_decode($string, $quote_style);
524  }
525  }
526 
533  public static function html_entity_decode_if_needed($string)
534  {
535  if (!empty($GLOBALS['site_parameters']['compatibility_mode_with_htmlentities_encoding_content']) && String::strpos($string, '<') === false) {
536  return String::html_entity_decode($string);
537  } else {
538  return $string;
539  }
540  }
541 
548  public static function strip_tags($string, $allowed_tags = null)
549  {
550  return str_replace(array(' - - - ', ' - - '), ' - ', str_replace(array("\n\n\n\n\n", "\n\n\n\n", "\n\n\n", ' ',' ', ' ', ' '), array("\n\n", "\n\n", "\n\n", ' ', ' ', ' ', ' '), strip_tags(str_replace(array('<br />', '<br>', '</p>', '</td>', '</tr>', '</div>', '</h3>', '</h4>'), array("\n", "\n", "\n", ' ', ' ', ' ', ' ', ' '), str_replace(array('<h1', '</h1>','<h2', '</h2>', '<li', "\t", "\r\n", "\r"), array(' - <h1', '</h1> - ', ' - <h2', '</h2> - ', "\n- <li", ' ', "\n", "\n"), $string)), $allowed_tags)));
551  }
552 
559  public static function nl2br_if_needed($string)
560  {
561  $has_no_br = String::strpos($string, '&lt;br') === false && String::strpos($string, '<br') === false;
562  // Attention aux balises param
563  $has_no_p = String::strpos($string, '&lt;p ') === false && String::strpos($string, '<p ') === false && String::strpos($string, '&lt;p&gt;') === false && String::strpos($string, '<p>') === false;
564  $has_no_table = String::strpos($string, '&lt;table') === false && String::strpos($string, '<table') === false;
565  $has_no_ul = String::strpos($string, '&lt;ul') === false && String::strpos($string, '<ul') === false;
566  $has_no_script = String::strpos($string, '&lt;script') === false && String::strpos($string, '<script') === false;
567  $has_no_div = String::strpos($string, '&lt;div') === false && String::strpos($string, '<div') === false;
568  if ($has_no_br && $has_no_p && $has_no_table && $has_no_ul && $has_no_script && $has_no_div) {
569  $string = str_replace(array("\n"), "<br />\n", str_replace(array("\r\n", "\r"), "\n", $string));
570  }
571  return $string;
572  }
573 
580  public static function detect_utf8_characters($string)
581  {
582  // On n'utilise pas mb_ detect_ encoding à cause de ses multiples bugs
583  return preg_match('%(?:
584  [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
585  |\xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
586  |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
587  |\xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
588  |\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
589  |[\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
590  |\xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
591  )+%xs', $string);
592  }
593 
602  public static function utf8_encode($string)
603  {
604  $cp1252_map = array("\xc2\x80" => "\xe2\x82\xac",/* EURO SIGN */
605  "\xc2\x82" => "\xe2\x80\x9a",/* SINGLE LOW-9 QUOTATION MARK */
606  "\xc2\x83" => "\xc6\x92",/* LATIN SMALL LETTER F WITH HOOK */
607  "\xc2\x84" => "\xe2\x80\x9e",/* DOUBLE LOW-9 QUOTATION MARK */
608  "\xc2\x85" => "\xe2\x80\xa6",/* HORIZONTAL ELLIPSIS */
609  "\xc2\x86" => "\xe2\x80\xa0",/* DAGGER */
610  "\xc2\x87" => "\xe2\x80\xa1",/* DOUBLE DAGGER */
611  "\xc2\x88" => "\xcb\x86",/* MODIFIER LETTER CIRCUMFLEX ACCENT */
612  "\xc2\x89" => "\xe2\x80\xb0",/* PER MILLE SIGN */
613  "\xc2\x8a" => "\xc5\xa0",/* LATIN CAPITAL LETTER S WITH CARON */
614  "\xc2\x8b" => "\xe2\x80\xb9",/* SINGLE LEFT-POINTING ANGLE QUOTATION */
615  "\xc2\x8c" => "\xc5\x92",/* LATIN CAPITAL LIGATURE OE */
616  "\xc2\x8e" => "\xc5\xbd",/* LATIN CAPITAL LETTER Z WITH CARON */
617  "\xc2\x91" => "\xe2\x80\x98",/* LEFT SINGLE QUOTATION MARK */
618  "\xc2\x92" => "\xe2\x80\x99",/* RIGHT SINGLE QUOTATION MARK */
619  "\xc2\x93" => "\xe2\x80\x9c",/* LEFT DOUBLE QUOTATION MARK */
620  "\xc2\x94" => "\xe2\x80\x9d",/* RIGHT DOUBLE QUOTATION MARK */
621  "\xc2\x95" => "\xe2\x80\xa2",/* BULLET */
622  "\xc2\x96" => "\xe2\x80\x93",/* EN DASH */
623  "\xc2\x97" => "\xe2\x80\x94",/* EM DASH */
624  "\xc2\x98" => "\xcb\x9c",/* SMALL TILDE */
625  "\xc2\x99" => "\xe2\x84\xa2",/* TRADE MARK SIGN */
626  "\xc2\x9a" => "\xc5\xa1",/* LATIN SMALL LETTER S WITH CARON */
627  "\xc2\x9b" => "\xe2\x80\xba",/* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
628  "\xc2\x9c" => "\xc5\x93",/* LATIN SMALL LIGATURE OE */
629  "\xc2\x9e" => "\xc5\xbe",/* LATIN SMALL LETTER Z WITH CARON */
630  "\xc2\x9f" => "\xc5\xb8"/* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
631  );
632  return strtr(utf8_encode($string), $cp1252_map);
633  }
634 
651  public static function getCleanHTML($text, $max_width = null, $allow_form = false, $allow_object = false, $allow_class = false, $additional_config = null, $safe = true, $additional_elements = null, $max_caracters_length = 50000, $max_octets_length = 59000, $max_word_and_url_length = 100)
652  {
653  require_once($GLOBALS['dirroot'] . "/lib/fonctions/htmlawed.php");
654  if (empty($text)) {
655  return false;
656  }
657  $text = trim(str_replace(array('’', ' lang="EN-GB"', ' lang=EN-GB', ' mso-ansi-language: EN-GB', '<span>', '<SPAN>', '<font>', '<FONT>', '<strong></strong>', '<b></b>', '<STRONG></STRONG>', '<B></B>',
658  "</td><br /><td", "<br />\n<td", "<br />\r\n<td", '<br /><td', '</td><br />', "<br />\n<tr", "<br />\r\n<tr", '<br /><tr', '</tr><br />',
659  "</TD><br /><TD", "<br />\n<TD", "<br />\r\n<TD", '<br /><TD', "<br />\n<TR", "<br />\r\n<TR", '<br /><TR', '<TR><br />', '<tr><br />',
660  'face=\'"arial,\'', 'sans-serif?', "<br /><LI", '<br /><TBODY>', '<br /><tbody>', '<TBODY><br />', '<tbody><br />', '<br /><COL', '<br /><col' , '<HR>', ' style=""', '<font>', '<span>', '<em><em>', '<b><b>', '<u><u>', '<i><i>',
661  ' ', ' ', ' ', ' ', ' ', ' class=MsoNormal', ' class="MsoNormal"', ' style="mso-bidi-font-weight: normal"', ' style=""', ' align=""',
662  '...', '-----', '_____', ':', ' ', '\\'),
663  array("'", '', '', '', '', '', '', '', '', '', '', '',
664  "</td><td", "\n<td", "\n<td", '<td', '</td>', "\n<tr", "\n<tr", '<tr', '</tr>',
665  "</TD><TD", "\n<TD", "\n<TD", '<TD', "\n<TR", "\n<TR", '<TR', '<TR>', '<tr>',
666  'face=\'arial\'', 'sans-serif', "<LI", '<TBODY>', '<tbody>', '<TBODY>', '<tbody>', '<COL', '<col' , '<hr />', '', '', '', '<em>', '<b>', '<u>', '<i>',
667  ' ', ' ', ' ', ' ', ' ', '', '', '', '', '',
668  '... ', '----- ', '_____ ', ': ', ' ', ''),
669  $text));
670  // On raccourcit tout ce qui dépasse 100 caractères de long sans espace : ce n'est pas normal car plus haut, on a ajouté des espaces derrières les ; et autres ...
671  $text = String::str_shorten_words($text, $max_word_and_url_length, ' ');
672  $text = str_replace(array(': //', ': 808'), array('://', ':808'), $text);
673  if(!empty($max_caracters_length) && String::strlen(vb($text)) > $max_caracters_length * 1.1) {
674  // On coupe le texte si il dépasse la valeur autorisée de 10%, avant de le passer dans getCleanHTML qui va regénérer les balises de cloture manquantes
675  $text = String::substr($text, 0, $max_caracters_length);
676  }
677  if(!empty($max_octets_length) && String::strlen(vb($text)) > $max_octets_length * 1.1) {
678  // On coupe le texte si il dépasse la valeur autorisée, avant de le passer dans getCleanHTML qui va regénérer les balises de cloture manquantes
679  // Coupure en octets, pas en caractères => substr et non pas String::substr
680  $text = substr($text, 0, $max_octets_length);
681  }
682  // $html_config['tidy']=1;
683  // ATTENTION : clean_ms_char corrompt le UTF8, donc il ne faut pas l'appliquer (si c'était compatible on aurait mis la valeur 2)
684  $html_config['clean_ms_char'] = 0;
685  $html_config['schemes'] = 'href: ftp, http, https, mailto; classid:clsid; *:http, https, data';
686  // $html_config['keep_bad']=1;
687  if (!empty($safe)) {
688  $html_config['safe'] = 1;
689  }
690  $html_config['comment'] = 1;
691  // $html_config['show_setting']='settings';
692  $html_config['elements'] = '*' . ($allow_object?'+object':'') . '' . ($allow_form?'':'-form') . '+embed-rb-rbc-rp-rt-rtc-ruby' . $additional_elements;
693  $html_config['make_tag_strict'] = 0;
694  $html_config['no_deprecated_attr'] = 0;
695  if (empty($allow_class)) {
696  if (empty($html_config['deny_attribute'])) {
697  $html_config['deny_attribute'] = 'class';
698  } else {
699  $html_config['deny_attribute'] .= ',class';
700  }
701  }
702  if (!empty($additional_config)) {
703  $html_config += $additional_config;
704  }
705  // $html_config['balance']=0;
706  /* $C['and_mark'] = empty($C['and_mark']) ? 0 : 1;
707  $C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0;
708  $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0;
709  $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1;
710  $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0);
711  $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char'];
712  $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0);
713  $C['css_expression'] = empty($C['css_expression']) ? 0 : 1;
714  $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1;
715  $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0;
716  $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0;
717  $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6;
718  $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1;
719  $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1;
720  $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1;
721  $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1;
722  $C['parent'] = isset($C['parent'][0]) ? String::strtolower($C['parent']) : 'body';
723  $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0;
724  $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy'];
725  $C['unique_ids'] = isset($C['unique_ids']) ? $C['unique_ids'] : 1;
726  $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0;
727  */
728 
729  $text_clean = htmLawed($text, $html_config);
730 
731  if (!empty($max_width)) {
732  // On remplace les largeurs trop importantes par de plus faibles
733  foreach(array('width="' => array('"'), 'width = "' => array('"'), "width='" => array("'"), "width = '" => array("'"), 'width:' => array(';', '"', "'"), 'width :' => array(';', '"', "'"), 'position:' => array(';', '"', "'"), 'position :' => array(';', '"', "'"), 'font-size :' => array(';', '"', "'"), 'font-size:' => array(';', '"', "'")) as $begin_item => $end_item_array) {
734  $text_end = String::strlen($text_clean);
735  $new_text_clean = '';
736  $pointer = 0;
737  while (($begin_pointer = String::strpos($text_clean, $begin_item, $pointer)) !== false) {
738  $end_pointer = false;
739  foreach($end_item_array as $end_item) {
740  $this_end_pointer = String::strpos($text_clean, $end_item, $begin_pointer + String::strlen($begin_item));
741  if (empty($end_pointer) || ($this_end_pointer < $end_pointer && $this_end_pointer > $begin_pointer)) {
742  $end_pointer = $this_end_pointer;
743  }
744  }
745  if ($end_pointer === false || $end_pointer < $begin_pointer) {
746  // On n'a pas trouvé la fin de l'expression : on abandonne ce remplacement et on passe au suivant
747  break;
748  }
749  $item_value = String::substr($text_clean, $begin_pointer + String::strlen($begin_item), $end_pointer - ($begin_pointer + String::strlen($begin_item)));
750  $item_value = str_replace(array('px', 'pt'), array(''), trim($item_value));
751  if (strpos($item_value, 'em') !== false) {
752  $item_value = intval(16 * str_replace(array('em'), array(''), $item_value));
753  }
754  if (is_numeric($item_value) && $item_value > 24 && String::substr($begin_item, 0, 4) == 'font') {
755  $item_value = 24;
756  } elseif (is_numeric($item_value) && $item_value > $max_width) {
757  $item_value = $max_width;
758  } elseif (is_numeric($item_value) && $item_value < 0) {
759  $item_value = 0;
760  }
761  if ($item_value == 'absolute') {
762  // On empêche le positionnement absolu
763  $item_value = 'relative';
764  }
765  $new_text_clean .= String::substr($text_clean, $pointer, $begin_pointer - $pointer) . $begin_item . $item_value;
766  if (is_numeric($item_value) && substr($begin_item, -1) == ':') {
767  $new_text_clean .= 'px';
768  }
769  $pointer = $end_pointer;
770  }
771  $text_clean = $new_text_clean . String::substr($text_clean, $pointer, $text_end - $pointer);
772  }
773  }
774  $text_clean = str_replace(array(' alt="alt"', 'td align="middle"', 'Verdana,;', '</td><', '</tr><', '<br /><', "\n\n\n\n", "\n\n\n", "\n\n", "\r\n\r\n\r\n", "\r\n\r\n", "\r\n", 'font-size: xx-large', 'font size="9"', 'font size="8"', 'font size="7"', ' style=""', ' align=""'),
775  array(' alt=""', 'td align="center"', 'Verdana;', "</td>\n<", "</tr>\n<", "<br />\n<", "\n", "\n", "\n", "\n", "\n", "\n", 'font-size: x-large', 'font size="6"', 'font size="6"', 'font size="6"', '', ''), $text_clean);
776  return $text_clean;
777  }
778 
793  public static function fopen_utf8($filename, $mode, $force_filename_in_iso_8859 = false, $try_filename_in_iso_8859_if_file_not_found = true)
794  {
795  if($force_filename_in_iso_8859 && String::detect_utf8_characters($filename)){
796  // On ne veut pas que le nom soit en UTF8
797  $filename = String::convert_encoding($filename, 'iso-8859-1', GENERAL_ENCODING);
798  }
799  $file = @fopen($filename, $mode);
800  if(empty($file) && $try_filename_in_iso_8859_if_file_not_found){
801  // Si le fichier a été enregistré non pas par l'application PEEL Shopping mais par un tiers, qui n'a pas mis le nom en UTF8
802  $filename = String::convert_encoding($filename, 'iso-8859-1', GENERAL_ENCODING);
803  $file = @fopen($filename, $mode);
804  }
805  if (!empty($file) && (substr($mode, 0, 1) == 'r' || strpos($mode, '+') !== false)) {
806  // Rewind ne va pas marcher si le fichier est en HTTP
807  $bom = fread($file, 3);
808  // On retire le BOM en début de fichier UTF8 si on en trouve un
809  // Le BOM est détecté avec pack("CCC", 0xef, 0xbb, 0xbf) ou "\xEF\xBB\xBF" ou b'\xEF\xBB\xBF' depuis PHP 5.2.1
810  if ($bom != "\xEF\xBB\xBF") {
811  // On n'a pas trouvé de BOM, donc on revient au début du fichier - sinon on ne fait rien, donc on a passé le BOM
812  if (strpos($filename, 'http://') !== 0 && strpos($filename, 'https://') !== 0) {
813  rewind($file);
814  } else {
815  // Rewind ne va pas marcher si le fichier est en HTTP
816  fclose($file);
817  $file = @fopen($filename, $mode);
818  }
819  }
820  }
821  return $file;
822  }
823 
836  public static function file_get_contents_utf8($filename, $force_filename_in_iso_8859 = false, $try_filename_in_iso_8859_if_file_not_found = true)
837  {
838  if($force_filename_in_iso_8859 && String::detect_utf8_characters($filename)){
839  // On ne veut pas que le nom soit en UTF8
840  $filename = String::convert_encoding($filename, 'iso-8859-1', GENERAL_ENCODING);
841  }
842  $file = @file_get_contents($filename);
843  if(empty($file) && $try_filename_in_iso_8859_if_file_not_found){
844  // Si le fichier a été enregistré non pas par l'application PEEL Shopping mais par un tiers, qui n'a pas mis le nom en UTF8
845  $filename = String::convert_encoding($filename, 'iso-8859-1', GENERAL_ENCODING);
846  $file = @file_get_contents($filename);
847  }
848  $bom = substr($file, 0, 3);
849  // On retire le BOM en début de fichier UTF8 si on en trouve un
850  // Le BOM est détecté avec pack("CCC", 0xef, 0xbb, 0xbf) ou "\xEF\xBB\xBF" ou b'\xEF\xBB\xBF' depuis PHP 5.2.1
851  if ($bom == "\xEF\xBB\xBF") {
852  // On a trouvé un BOM, on le retire donc
853  $file = substr($file, 3);
854  }
855  return $file;
856  }
857 
866  public static function feof($handle) {
867  static $timeout;
868  if($handle === false) {
869  return true;
870  }
871  // gestion des timeouts : feof renvoie false si il y a eu un timeout, et on change cela en true pour pouvoir faire des tests simples ensuite avec des while(!String::feof($file)) { ... }
872  if(!isset($timeout)) {
873  $timeout = @ini_get('default_socket_timeout');
874  }
875  if(empty($timeout)) {
876  $timeout = 10;
877  }
878  $start = microtime(true);
879  $result = feof($handle);
880  if(!$result && (microtime(true) - $start >= $timeout)) {
881  return true;
882  }
883  return $result;
884  }
885 
893  public static function rawurlencode($string, $avoid_slash = true)
894  {
895  if ($avoid_slash) {
896  return rawurlencode(str_replace('/', '-', $string));
897  } else {
898  return rawurlencode($string);
899  }
900  }
901 
909  public static function rawurldecode($string, $avoid_slash = false)
910  {
911  if ($avoid_slash) {
912  return str_replace('/', '-', rawurldecode($string));
913  } else {
914  return rawurldecode($string);
915  }
916  }
917 }
918 
static strtoupper($string)
Returns string with all alphabetic characters converted to uppercase.
Definition: String.php:154
static strip_tags($string, $allowed_tags=null)
String::strip_tags()
Definition: String.php:548
static htmlentities($string, $flags=ENT_COMPAT, $charset=GENERAL_ENCODING, $suppr_endline=false, $encode_only_isolated_amperstands=false, $decode_html_entities_first=false)
Convert all applicable characters to HTML entities Cette fonction sert si on veut afficher du contenu...
Definition: String.php:411
static htmlspecialchars_decode($string, $style=ENT_COMPAT)
This function is String::htmlspecialchars_decode with php4 compatibility.
Definition: String.php:500
$result
static utf8_encode($string)
Si vous avez des utilisateurs sous windows qui saisissent du contenu dans une interface qui l'insère ...
Definition: String.php:602
static convert_encoding($string, $new_encoding, $original_encoding=null)
Converts the character encoding of string $string to $new_encoding from optionally $original_encoding...
Definition: String.php:375
static textEncode($string, $suppr_endline=false, $encode_only_isolated_amperstands=false)
Méthode de compatibilité avec anciennes versions de PEEL utilisant textEncode au lieu de htmlentities...
Definition: String.php:468
static strpos($haystack, $needle, $offset=0)
Returns the numeric position of the first occurrence of needle in the haystack string.
Definition: String.php:54
static rawurldecode($string, $avoid_slash=false)
Returns rawurldecode.
Definition: String.php:909
static getCleanHTML($text, $max_width=null, $allow_form=false, $allow_object=false, $allow_class=false, $additional_config=null, $safe=true, $additional_elements=null, $max_caracters_length=50000, $max_octets_length=59000, $max_word_and_url_length=100)
Fonction qui nettoie le HTML.
Definition: String.php:651
static cut_with_separator($string, $max_part_length=40, $separator= ' ')
Adds a seperator every $max_part_length characters.
Definition: String.php:211
static fopen_utf8($filename, $mode, $force_filename_in_iso_8859=false, $try_filename_in_iso_8859_if_file_not_found=true)
Ouvre un fichier.
Definition: String.php:793
static html_entity_decode_if_needed($string)
String::html_entity_decode_if_needed()
Definition: String.php:533
static strtolower($string)
Returns string with all alphabetic characters converted to lowercase.
Definition: String.php:135
$mode
static file_get_contents_utf8($filename, $force_filename_in_iso_8859=false, $try_filename_in_iso_8859_if_file_not_found=true)
Renvoie le contenu d'un fichier.
Definition: String.php:836
static strlen($string)
Returns the length of the given string.
Definition: String.php:36
$start
Definition: attributs.php:22
static feof($handle)
Tests for end-of-file on a file pointer In contrary of the default feof function, it returns true if ...
Definition: String.php:866
static str_shorten_words($string, $length_limit=100, $separator=" ", $force_shorten_if_special_content=false, $add_separator_instead_of_cutting=true)
On rajoute des espaces à l'intérieur des mots trop longs => à utiliser pour éviter de casser une mise...
Definition: String.php:305
static str_form_value($value, $flags=ENT_COMPAT)
Encode une chaine de caractères pour affichage dans un value="".
Definition: String.php:480
vb(&$var, $default=null)
Variable blanche if $var n'est pas défini, retourne $default, sinon retourne $var.
Definition: format.php:97
if(strlen($date2)== '10') if($type== 'users-by-age'&&a_priv('admin_users', true)) elseif($type== 'forums-count'&&a_priv('admin_content', true)) elseif($type== 'forums-categories'&&a_priv('admin_content', true)) elseif($type== 'users-count'&&a_priv('admin_users', true)) elseif($type== 'product-categories'&&a_priv('admin_products', true)) elseif($type== 'users-by-sex'&&a_priv('admin_users', true)) elseif($type== 'users-by-country'&&a_priv('admin_users', true)) elseif($type== 'sales'&&a_priv('admin_sales', true))
Definition: chart-data.php:160
static detect_utf8_characters($string)
Détecte si au moins un caractère est manifestement de l'UTF8.
Definition: String.php:580
static str_htmlentities($string, $suppr_endline=false, $encode_only_isolated_amperstands=false)
Méthode de compatibilité avec anciennes versions de PEEL utilisant str_htmlentities au lieu de htmlen...
Definition: String.php:455
static strrpos($haystack, $needle, $offset=0)
Returns the numeric position of the last occurrence of needle in the haystack string.
Definition: String.php:76
$filename
static html_entity_decode($string, $quote_style=ENT_COMPAT, $charset=GENERAL_ENCODING)
String::html_entity_decode()
Definition: String.php:517
if(!defined('IN_PEEL')) $GLOBALS['ucfirsts']
Definition: String.php:18
static convert_accents($string, $convert_umlaut=false, $strip_umlaut=true)
convert_accents()
Definition: String.php:341
static substr($string, $start, $length=null)
Returns the portion of string specified by the start and length parameters.
Definition: String.php:112
static substr_count($string, $searched)
Returns the number of times the needle substring occurs in the haystack string.
Definition: String.php:194
static nl2br_if_needed($string)
Fonction de compatibilité avec de vieilles versions de PEEL ou du contenu qui vient d'ailleurs...
Definition: String.php:559
static str_shorten($string, $length_limit, $middle_separator= '', $ending_if_no_middle_separator= '...', $ideal_length_with_clean_cut_if_possible=null)
Raccourcit une chaine de caractère en insérant au milieu ou à la fin un séparateur.
Definition: String.php:233
static ucfirst($string)
Returns string with first letter uppercase.
Definition: String.php:173
if(defined('IN_PEEL_ADMIN')||IN_INSTALLATION) $_SESSION['session_langue']
static rawurlencode($string, $avoid_slash=true)
Returns string compatible with Apache without the AllowEncodedSlashes directive ON => avoids systemat...
Definition: String.php:893

This documentation for Open ecommerce PEEL Shopping and PEEL.fr has been generated by Doxygen on Thu Oct 15 2015 14:30:08 - Peel ecommerce is a product of Agence web Advisto SAS. All rights reserved.