Source of file StringHelper.php

Size: 4,392 Bytes - Last Modified: 2023-11-16T22:56:02+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/core-bundle/src/Util/StringHelper.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
<?php
namespace TIC\CoreBundle\Util;

/**
 * Méthodes statiques utilitaires pour convertir des chaines de caractères.
 */
class StringHelper
{

	/**
	 * This class should not be instantiated.
	 */
	private function __construct()
	{
	}

	/**
	 * Retourne une chaine ASCII en convertissant les caractères étendus.
	 *
	 * @param   string  $text       Texte en UTF-8 à transformer
	 * @return  string              Chaine équivalente avec les caractères 7 bits
	 */
	public static function asciify(string $text): string
	{
		return \preg_replace_callback('/([\xA0-\xFF])/', function($m){
			// remplacement des caractères du second bloc par leurs équivalents
			$mapA0FF = ' !cL*Y|$_ca<--R_o+23\'mp.,10>423?AAAAAAACEEEEIIIIDNOOOOOx0UUUUYPBaaaaaaaceeeeiiiidnooooo:0uuuuypy';
			return \substr($mapA0FF, \ord($m[0]) - 160, 1);
		},
			// conversion du texte d'origine supposé en UTF-8 en latin
			\mb_convert_encoding($text, 'iso-8859-15', 'UTF-8')
		);
	}

	/**
	 * Retourne une chaine canonisée à partir d'une chaine donnée.
	 *
	 * @param   string  $text       Texte en UTF-8 à slugifier
	 * @param   string  $re_ok      Ensemble des caractères autorisés (pour regexp)
	 * @param   string  $subst      Caractère de substitution pour les caractères non autorisés
	 * @return  string              Slug en minuscules et underscores pour les espaces
	 */
	public static function slugify(string $text, string $subst = '-', string $re_ok = 'a-z0-9_\-\.'): string
	{
		// remplacement des caractères du second bloc ASCII par leurs équivalents en ISO latin
		$slug = self::asciify($text);
		
		// substitution des espaces en underscores et des autres caractères en tirets
		$slug = \preg_replace('/[^'.$re_ok.']/', '-', \strtolower(\strtr($slug, ' ', '_')));
		
		// retrait des caractères de séparation/substitution consécutifs et terminaux
		return \trim(\preg_replace('/([_\-\.])[_\-\.]+/', '$1', $slug), '_-.');
	}

	/**
	 * Retourne une chaine avec les échappements pour du code JavaScript.
	 * cf. Twig\Extension\EscaperExtension : twig_escape_filter()
	 *
	 * @param   string  $text       Valeur à échapper pour utilisation dans du code JS
	 * @return  string              Valeur échappée prête pour insertion dans du code JS
	 */
	public static function jsescape(string $text): string
	{
		return \preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', function ($matches) {
			$char = $matches[0];
			
			// A few characters have short escape sequences in JSON and JavaScript.
			// Escape sequences supported only by JavaScript, not JSON, are omitted.
			// \" is also supported but omitted, because the resulting string is not HTML safe.
			$shortMap = [
				"\\"   => "\\\\",
				'/'    => '\\/',
				"\x08" => '\b',
				"\x0C" => '\f',
				"\x0A" => '\n',
				"\x0D" => '\r',
				"\x09" => '\t',
			];
			if (isset($shortMap[$char])) return $shortMap[$char];
			
			$codepoint = \mb_ord($char);
			if (0x10000 > $codepoint) return \sprintf('\u%04X', $codepoint);
			
			// Split characters outside the BMP into surrogate pairs
			// https://tools.ietf.org/html/rfc2781.html#section-2.1
			$u = $codepoint - 0x10000;
			return \sprintf('\u%04X\u%04X', 0xD800 | ($u >> 10), 0xDC00 | ($u & 0x3FF));
		}, $text);
	}

	/**
	 * Génération d'une chaine aléatoire.
	 *
	 * @param   integer $length     Nombre de caractères à générer (longueur de la chaine)
	 * @param   mixed   $sigils     Alphabet à utiliser (caractères autorisés dans la chaine)
	 *                              si Null  : ensemble alpha-numérique [a-zA-Z0-9]
	 *                              si True  : ASCII de base imprimable, sauf & < > $ ^ " ' ` \ |
	 *                              si False : alpha-numérique non ambigus [A-Z0-9], sauf 0 O 1 I
	 * @return  string              Chaine constituée de $length caractères aléatoires parmis $sigils
	 */
	public static function genrandom(int $length = 8, mixed $sigils = null): string
	{
		if     (null  === $sigils) $sigils = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
		elseif (true  === $sigils) $sigils = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+/*=.,;:!?@#%~(){}[]';
		elseif (false === $sigils) $sigils = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
		
		\srand((double)\microtime()*1000000);
		$str = '';
		while ($length-- > 0) $str.= $sigils[ \rand() % \strlen($sigils) ];
		return $str;
	}

}