Skip to content
Snippets Groups Projects
Commit 0af6a8e2 authored by David Surville's avatar David Surville
Browse files

Reprise du développement de la librairie. Ajout notamment de fonctions pour chaque attribut Ldap

parent 78275982
No related branches found
No related tags found
No related merge requests found
<?php
namespace UnicaenLdap\Entity\Base;
use DateTime;
use UnicaenLdap\Entity\Entity;
use UnicaenLdap\Util;
use Zend\Ldap\Exception\LdapException;
/**
* Classe mère des entités de la branche "people" de l'annuaire LDAP.
*
* @author David Surville <david.surville at unicaen.fr>
*/
class People extends Entity
{
protected $type = 'People';
/**
* Liste des classes d'objet nécessaires à la création d'une personne
* Il est nécessaire d'ajouter la classe 'ucbnEtu' ou 'ucbnEmp' selon le
* statut de la personne.
*
* @var array
*/
protected $objectClass = [
'top',
'inetOrgPerson',
'organizationalPerson',
'person',
'eduPerson',
'supannPerson',
'sambaAccount',
'sambaSamAcount',
'posixAccount',
];
/**
* Liste des attributs contenant des dates
*
* @var array
*/
protected $dateTimeAttributes = [];
/**
* @param string $attrName
* @param mixed $value
* @param bool $append
* @throws \Zend\Ldap\Exception\LdapException
*/
private function _appendOrNot($attrName, $value, $append)
{
(!$append)
? $this->set($attrName, $value)
: $this->add($attrName, $value);
}
/**
* Attribut Ldap "sn"
*
* Nom d'un individu
* Doit contenir le nom d'usage. Il est possible d'ajouter le nom de famille en seconde valeur.
*
* Multivalué
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSn($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatName'], array_filter($data));
$this->_appendOrNot('sn', $values, $append);
return $this;
}
/**
* Attribut Ldap "givenName"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setGivenName($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatName'], array_filter($data));
$this->_appendOrNot('givenName', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "displayName"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setDisplayName($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatName'], array_filter($data));
$this->_appendOrNot('displayName', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "cn"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setCn($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatName'], array_filter($data));
$this->_appendOrNot('cn', Util::removeAccents($values[key($values)]), $append);
return $this;
}
/**
* Attribut Ldap "dateDeNaissance"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setDateDeNaissance($data = null, $append = false)
{
$data = (array)$data;
$values = array_map(function ($val) {
if (is_string($val)) {
$val = new DateTime($val);
}
return $val->format('Ymd');
}, array_filter($data));
$this->_appendOrNot('dateDeNaissance', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "schacDateOfBirth"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSchacDateOfBirth($data = null, $append = false)
{
$data = (array)$data;
$values = array_map(function ($val) {
if (is_string($val)) {
$val = new DateTime($val);
}
return $val->format('Ymd');
}, array_filter($data));
$this->_appendOrNot('schacDateOfBirth', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "sexe"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSexe($data = null, $append = false)
{
if (is_array($data)) {
$values = array_filter($data);
$data = $values[key($values)];
}
$value = (in_array($data, ['F', 'M'])) ? $data : null;
$this->_appendOrNot('sexe', $value, $append);
}
/**
* Attribut Ldap "postalAddress"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setPostalAddress($data = null, $append = false)
{
$data = (array)$data;
$values = array_filter($data, function($v) {
return preg_match('/.*\$.*\$.*\$.*\$.*\$.*/', $v);
});
$this->_appendOrNot('postalAddress', $values, $append);
return $this;
}
/**
* Attribut Ldap "telephoneNumber"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setTelephoneNumber($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatTel'], array_filter($data));
$this->_appendOrNot('telephoneNumber', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "supannAutreTelephone"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannAutreTelephone($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatTel'], array_filter($data));
$this->_appendOrNot('supannAutreTelephone', $values, $append);
return $this;
}
/**
* Attribut Ldap "mobile"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setMobile($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatTel'], array_filter($data));
$this->_appendOrNot('mobile', $values, $append);
return $this;
}
/**
* Attribut Ldap "preferredLanguage"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setPreferredLanguage($data = null, $append = false)
{
$data = (array)$data;
$values = array_map('strtolower', array_filter($data));
$this->_appendOrNot('preferredLanguage', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "leoCode"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setLeoCode($data = null, $append = false)
{
$data = (array)$data;
$values = array_filter($data, function($v) {
return preg_match('/^\d+$/', $v);
});
$this->_appendOrNot('leoCode', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "supannALiasLogin"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannAliasLogin($data = null, $append = false)
{
$data = (array)$data;
$values = array_map('strtolower', $data);
$values = array_filter($values, function($v) {
return preg_match('/^[0-9a-z\-]+$/', $v);
});
$this->_appendOrNot('supannAliasLogin', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "supannEmpId"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannEmpId($data = null, $append = false)
{
if (is_array($data)) {
$values = array_filter($data);
$data = $values[key($values)];
}
$this->_appendOrNot('supannEmpId', $data, $append);
}
/**
* Attribut Ldap "supannEtuId"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannEtuId($data = null, $append = false)
{
if (is_array($data)) {
$values = array_filter($data);
$data = $values[key($values)];
}
$this->_appendOrNot('supannEtuId', $data, $append);
}
/**
* Attribut Ldap "supannCodeINE"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannCodeINE($data = null, $append = false)
{
$data = (array)$data;
$values = array_map('strtoupper', $data);
$values = array_filter($values, function($v) {
return preg_match('/^[0-9]{10}[A-Z]{1}$/', $v);
});
$this->_appendOrNot('supannCodeINE', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "supannCivilite"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannCivilite($data = null, $append = false)
{
if (is_array($data)) {
$values = array_filter($data);
$data = $values[key($values)];
}
$value = (in_array($data, ['Mme', 'M.'])) ? $data : null;
$this->_appendOrNot('supannCivilite', $value, $append);
}
/**
* Attribut Ldap "supannListeRouge"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannListeRouge($data = null, $append = false)
{
$data = (array)$data;
$values = array_map([$this, 'formatBoolean'], array_filter($data));
$this->_appendOrNot('supannListeRouge', $values[key($values)], $append);
return $this;
}
/**
* Attribut Ldap "supannMailPerso"
*
* @param array|string|null $data
* @param bool $append
* @return self
* @throws LdapException
*/
public function setSupannMailPerso($data = null, $append = false)
{
$data = (array)$data;
$values = array_filter(filter_var_array($data, FILTER_VALIDATE_EMAIL));
$this->_appendOrNot('supannMailPerso', $values, $append);
return $this;
}
/**
* Retourne les structures auxquelles appartiennent la personne
*
* @return Structure[]
*/
public function getEduPersonOrgUnit()
{
$structure = $this->getService()->getServiceLocator()->get('ldapServiceStructure');
$dn = $this->eduPersonOrgUnitDN;
if (empty($dn)) return null;
return $structure->getAllBy($dn, 'dn');
}
/**
* Retourne la structure principale à laquelle appartient la personne
*
* @return Structure
*/
public function getEduPersonPrimaryOrgUnit()
{
$structure = $this->getService()->getServiceLocator()->get('ldapServiceStructure');
$dn = $this->eduPersonPrimaryOrgUnitDN;
if (empty($dn)) return null;
return $structure->getBy($dn, 'dn');
}
/**
* Retourne la structure d'affectation de la personne
*
* @todo à terminer
* @return Structure[]
* @throws \Exception
*/
public function getSupannEntiteAffectation()
{
throw new \Exception('Méthode pas finie');
$structure = $this->getService()->getServiceLocator()->get('ldapServiceStructure');
$codes = $this->getNode()->getAttribute('supannEntiteAffectation');
var_dump($codes);
return $structure->getBy($dn, 'dn');
}
/**
* Retourne la structure d'affectation de la personne
*
* @todo à terminer
* @return Structure
* @throws \Exception
*/
public function getSupannEntiteAffectationPrincipale()
{
throw new \Exception('Méthode pas finie');
$structure = $this->getService()->getServiceLocator()->get('ldapServiceStructure');
$codes = [];
$affectations = $this->getNode()->getAttribute('supannAffectation');
list($code, $description) = explode(';', $this->supannAffectation);
$code = $this->supannAffectation;
if (empty($dn)) return null;
return $structure->getBy($dn, 'dn');
}
/**
* Formate un nom ou un prénom
*
* @param string $name
* @return mixed|null|string|string[]
*/
protected function formatName($name)
{
$name = preg_replace('/[[:blank:]]+/', ' ', trim($name));
return mb_convert_case($name, MB_CASE_TITLE, "UTF-8");
}
/**
* Formate un numéro de téléphone (0XXXXXXXXX) au format international (+33 X XX XX XX XX)
*
* @param string $num
* @return string
*/
protected function formatTel($num)
{
if (is_null($num)) {
return $num;
}
$num = preg_replace('/\s+/', '', $num);
return preg_match("/0\d{9}/", $num)
? preg_replace("/0(\d{1})(\d{2})(\d{2})(\d{2})(\d{2})/", "+33 $1 $2 $3 $4 $5", $num)
: $num;
}
/**
* Formate les données sources correspondant à un booléen
*
* @param mixed $value
* @return string
*/
protected function formatBoolean($value)
{
if (!is_bool($value) && $value === null) {
return null;
}
if(is_string($value)) {
$value = strtolower($value);
}
switch ($value) {
case $value === false;
case $value === 0:
case $value === 'n':
return 'FALSE';
case $value === true:
case $value === 1:
case $value === 'o':
case $value === 'y':
return 'TRUE';
default:
return null;
}
}
}
\ No newline at end of file
......@@ -5,6 +5,8 @@ namespace UnicaenLdap\Entity;
use UnicaenLdap\Node;
use UnicaenLdap\Exception;
use UnicaenLdap\Service\AbstractService;
use Zend\Ldap\Dn;
use Zend\Ldap\Exception\LdapException;
/**
* Classe mère des entrées de l'annuaire LDAP.
......@@ -35,21 +37,49 @@ abstract class Entity
/**
* Liste des classes d'objet nécessaires à la création de l'entité
*
* @var string[]
* @var array
*/
protected $objectClass = [
protected $objectClass = [];
];
/**
* Liste des labels utilisés dans les différents attributs
*
* @var array
*/
// protected $labels = [
// 'AUTRE' => 'AUTRE', // Texte libre
// 'BAP' => 'BAP', // Branche d'Activité Professionnelle REFERENS
// 'CNRS' => 'CNRS', // LABINTEL (CNRS)
// 'CNU' => 'CNU', // Section CNU
// 'INRA' => 'INRA', // INRA
// 'INRIA' => 'INRIA', // INRIA
// 'INSERM' => 'INSERM', // INSERM
// 'NCORPS' => 'NCORPS', // BCN: code issu de la colonne “CORPS” de la table “N_CORPS” du domaine “Gestion du personnel”
// 'REFERENS' => 'REFERENS', // Emploi-type REFERENS
// 'SAML' => 'SAML', // Fédération d'identités
// 'SILLAND' => 'SILLAND', // Fonction SILLAND
// 'SIRET' => 'SIRET', // SIRET (INSEE)
// 'SISE' => 'SISE', // BCN: valeur “DIPLOME SISE” de la table N_DIPLOME_SISE
// 'SUPANN' => 'SUPANN', // Label nomenclatures SupAnn
// 'TVA' => 'TVA', // Union Européenne
// 'UAI' => 'UAI', // Unité Administrative Immatriculée (UAI)
// 'UAI_ETABLISSEMENT' => 'UAI:%s',
//
// ];
/**
* Liste des attributs contenant des dates
*
* @var string[]
* @var array
*/
protected $dateTimeAttributes = [
protected $dateTimeAttributes = [];
];
/**
* @param string $type type d'entité
* @return array
* @throws Exception
*/
public static function getNodeParams($type)
{
$params = [
......@@ -65,10 +95,11 @@ abstract class Entity
}
/**
* Construit une entrée.
* Entity constructor.
*
* @param AbstractService $service Service qui gèrera la future entité
* @param Node|Dn|array|string $data Noeud si Node, sinon DN
* @throws LdapException
*/
public function __construct(AbstractService $service, $data)
{
......@@ -121,6 +152,17 @@ abstract class Entity
$this->node = $node;
}
/**
* Retourne un label en fonction d'une clé
*
* @param $key
* @return null|string
*/
// public function getLabel($key)
// {
// return $this->labels[$key];
// }
/**
* Retourne le Dn de l'entité sous forme de chaîne de caractères
*
......@@ -134,23 +176,24 @@ abstract class Entity
/**
* Retourne la clé primaire correspondant à l'entité
*
* @return string
* @return mixed
* @throws Exception
*/
public function getId()
public function getKey()
{
list($key) = self::getNodeParams($this->type);
return $this->get($key);
return reset(self::getNodeParams($this->type));
}
/**
* Retourne la clé primaire correspondant à l'entité
* Retourne la valeur de la clé primaire correspondant à l'entité
*
* @return string
* @throws Exception
* @throws LdapException
*/
public function getKey()
public function getId()
{
return reset(self::getNodeParams($this->type));
return $this->get($this->getKey());
}
/**
......@@ -167,6 +210,7 @@ abstract class Entity
* Exporte sous forme de tableau le contenu de l'entité
*
* @return array
* @throws LdapException
*/
public function toArray()
{
......@@ -179,47 +223,12 @@ abstract class Entity
return $result;
}
/**
* Mise à jour de l'entité
*
* @return self
*/
public function update()
{
$this->getNode()->update();
return $this;
}
/**
* Suppression de l'entité
*
* @return self
*/
public function delete()
{
$this->getNode()->delete();
return $this;
}
/**
* Insertion de l'entité
*
* @return self
*/
public function insert()
{
$this->getNode()->attachLdap($this->service->getLdap());
return $this;
}
/**
* Retourne un attribut
*
* @param string $attrName
* @return mixed
* @return array|int|mixed|null
* @throws LdapException
*/
public function get($attrName)
{
......@@ -243,6 +252,7 @@ abstract class Entity
* @param string $attrName
* @param mixed $value
* @return self
* @throws LdapException
*/
public function set($attrName, $value)
{
......@@ -273,6 +283,7 @@ abstract class Entity
* @param string $attrName
* @param mixed $value
* @return self
* @throws LdapException
*/
public function add($attrName, $value)
{
......@@ -288,8 +299,8 @@ abstract class Entity
/**
* Retire une valeur à un attribut
*
* @param type $attrName
* @param type $value
* @param string $attrName
* @param mixed|array $value
* @return self
*/
public function remove($attrName, $value)
......@@ -304,6 +315,7 @@ abstract class Entity
*
* @param string $attrName
* @return mixed
* @throws LdapException
*/
public function __get($attrName)
{
......@@ -316,6 +328,7 @@ abstract class Entity
* @param string $attrName
* @param mixed $value
* @return self
* @throws LdapException
*/
public function __set($attrName, $value)
{
......@@ -341,4 +354,53 @@ abstract class Entity
}
}
}
/**
* Mise à jour de l'entité
*
* @return self
* @throws LdapException
*/
public function update()
{
$this->getNode()->update();
return $this;
}
/**
* Suppression de l'entité
*
* @return self
*/
public function delete()
{
$this->getNode()->delete();
return $this;
}
/**
* Attache une connexion
*
* @return self
* @throws LdapException
*/
public function attach()
{
$this->getNode()->attachLdap($this->service->getLdap());
return $this;
}
/**
* Retourne l'attribut "objectClass"
*
* @return array|int|mixed|null
* @throws LdapException
*/
public function getObjectClass()
{
return $this->get('objectClass');
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@
namespace UnicaenLdap\Entity;
use UnicaenLdap\Entity\Base\People as BasePeople;
use DateTime;
/**
......@@ -10,7 +11,7 @@ use DateTime;
* @author Laurent Lécluse <laurent.lecluse at unicaen.fr>
* @author Bertrand GAUTHIER <bertrand.gauthier@unicaen.fr>
*/
class People extends Entity
class People extends BasePeople
{
static protected $role_pattern = '/^\[role={SUPANN}(.*)\]\[type={SUPANN}(.*)\]\[code=(.*)\]\[libelle=(.*)\]$/';
......@@ -25,36 +26,6 @@ class People extends Entity
'RESP_ADMINISTRATIF' => 'R40',
];
protected $type = 'People';
/**
* Liste des classes d'objet nécessaires à la création d'une personne
* Il est nécessaire d'ajouter la classe 'ucbnEtu' ou 'ucbnEmp' selon le
* statut de la personne.
*
* @var string[]
*/
protected $objectClass = [
'top',
'inetOrgPerson',
'organizationalPerson',
'person',
'eduPerson',
'supannPerson',
'sambaAccount',
'sambaSamAcount',
'posixAccount',
];
/**
* Liste des attributs contenant des dates
*
* @var string[]
*/
protected $dateTimeAttributes = [
];
/**
* Retourne le nom complet de cet individu LDAP.
*
......
......@@ -462,6 +462,8 @@ abstract class AbstractService
* @param mixed $value Valeur de champ à rechercher
* @param string $by Nom du champ à tester
* @return boolean
* @throws Exception
* @throws \Zend\Ldap\Exception\LdapException
*/
public function existsBy( $value, $by )
{
......@@ -487,15 +489,15 @@ abstract class AbstractService
*/
public function create( $id, $ou=null )
{
list($key, $classname) = Entity::getNodeParams($this->type);
if (empty($ou)){
if (count($this->ou) > 1){
throw new Exception('$ou non renseigné alors que le service couvre plusieurs Organizational Units (OU).');
}
$ou = $this->ou[0];
}
$dn = $key.'='.$id.',ou='.$ou.','.$this->getLdap()->getBaseDn();
$classname = 'UnicaenLdap\\Entity\\'.$this->type;
list($key, $classname) = Entity::getNodeParams($this->type);
$dn = sprintf('%s=%s,ou=%s,%s', $key, $id, $ou, $this->getLdap()->getBaseDn());
return new $classname( $this, $dn);
}
......
<?php
namespace UnicaenLdap;
class Util
{
static public function removeAccents($string)
{
if (!preg_match('/[\x80-\xff]/', $string))
return $string;
$chars = [
// Decompositions for Latin-1 Supplement
chr(195) . chr(128) => 'A', chr(195) . chr(129) => 'A',
chr(195) . chr(130) => 'A', chr(195) . chr(131) => 'A',
chr(195) . chr(132) => 'A', chr(195) . chr(133) => 'A',
chr(195) . chr(135) => 'C', chr(195) . chr(136) => 'E',
chr(195) . chr(137) => 'E', chr(195) . chr(138) => 'E',
chr(195) . chr(139) => 'E', chr(195) . chr(140) => 'I',
chr(195) . chr(141) => 'I', chr(195) . chr(142) => 'I',
chr(195) . chr(143) => 'I', chr(195) . chr(145) => 'N',
chr(195) . chr(146) => 'O', chr(195) . chr(147) => 'O',
chr(195) . chr(148) => 'O', chr(195) . chr(149) => 'O',
chr(195) . chr(150) => 'O', chr(195) . chr(153) => 'U',
chr(195) . chr(154) => 'U', chr(195) . chr(155) => 'U',
chr(195) . chr(156) => 'U', chr(195) . chr(157) => 'Y',
chr(195) . chr(159) => 's', chr(195) . chr(160) => 'a',
chr(195) . chr(161) => 'a', chr(195) . chr(162) => 'a',
chr(195) . chr(163) => 'a', chr(195) . chr(164) => 'a',
chr(195) . chr(165) => 'a', chr(195) . chr(167) => 'c',
chr(195) . chr(168) => 'e', chr(195) . chr(169) => 'e',
chr(195) . chr(170) => 'e', chr(195) . chr(171) => 'e',
chr(195) . chr(172) => 'i', chr(195) . chr(173) => 'i',
chr(195) . chr(174) => 'i', chr(195) . chr(175) => 'i',
chr(195) . chr(177) => 'n', chr(195) . chr(178) => 'o',
chr(195) . chr(179) => 'o', chr(195) . chr(180) => 'o',
chr(195) . chr(181) => 'o', chr(195) . chr(182) => 'o',
chr(195) . chr(182) => 'o', chr(195) . chr(185) => 'u',
chr(195) . chr(186) => 'u', chr(195) . chr(187) => 'u',
chr(195) . chr(188) => 'u', chr(195) . chr(189) => 'y',
chr(195) . chr(191) => 'y',
// Decompositions for Latin Extended-A
chr(196) . chr(128) => 'A', chr(196) . chr(129) => 'a',
chr(196) . chr(130) => 'A', chr(196) . chr(131) => 'a',
chr(196) . chr(132) => 'A', chr(196) . chr(133) => 'a',
chr(196) . chr(134) => 'C', chr(196) . chr(135) => 'c',
chr(196) . chr(136) => 'C', chr(196) . chr(137) => 'c',
chr(196) . chr(138) => 'C', chr(196) . chr(139) => 'c',
chr(196) . chr(140) => 'C', chr(196) . chr(141) => 'c',
chr(196) . chr(142) => 'D', chr(196) . chr(143) => 'd',
chr(196) . chr(144) => 'D', chr(196) . chr(145) => 'd',
chr(196) . chr(146) => 'E', chr(196) . chr(147) => 'e',
chr(196) . chr(148) => 'E', chr(196) . chr(149) => 'e',
chr(196) . chr(150) => 'E', chr(196) . chr(151) => 'e',
chr(196) . chr(152) => 'E', chr(196) . chr(153) => 'e',
chr(196) . chr(154) => 'E', chr(196) . chr(155) => 'e',
chr(196) . chr(156) => 'G', chr(196) . chr(157) => 'g',
chr(196) . chr(158) => 'G', chr(196) . chr(159) => 'g',
chr(196) . chr(160) => 'G', chr(196) . chr(161) => 'g',
chr(196) . chr(162) => 'G', chr(196) . chr(163) => 'g',
chr(196) . chr(164) => 'H', chr(196) . chr(165) => 'h',
chr(196) . chr(166) => 'H', chr(196) . chr(167) => 'h',
chr(196) . chr(168) => 'I', chr(196) . chr(169) => 'i',
chr(196) . chr(170) => 'I', chr(196) . chr(171) => 'i',
chr(196) . chr(172) => 'I', chr(196) . chr(173) => 'i',
chr(196) . chr(174) => 'I', chr(196) . chr(175) => 'i',
chr(196) . chr(176) => 'I', chr(196) . chr(177) => 'i',
chr(196) . chr(178) => 'IJ', chr(196) . chr(179) => 'ij',
chr(196) . chr(180) => 'J', chr(196) . chr(181) => 'j',
chr(196) . chr(182) => 'K', chr(196) . chr(183) => 'k',
chr(196) . chr(184) => 'k', chr(196) . chr(185) => 'L',
chr(196) . chr(186) => 'l', chr(196) . chr(187) => 'L',
chr(196) . chr(188) => 'l', chr(196) . chr(189) => 'L',
chr(196) . chr(190) => 'l', chr(196) . chr(191) => 'L',
chr(197) . chr(128) => 'l', chr(197) . chr(129) => 'L',
chr(197) . chr(130) => 'l', chr(197) . chr(131) => 'N',
chr(197) . chr(132) => 'n', chr(197) . chr(133) => 'N',
chr(197) . chr(134) => 'n', chr(197) . chr(135) => 'N',
chr(197) . chr(136) => 'n', chr(197) . chr(137) => 'N',
chr(197) . chr(138) => 'n', chr(197) . chr(139) => 'N',
chr(197) . chr(140) => 'O', chr(197) . chr(141) => 'o',
chr(197) . chr(142) => 'O', chr(197) . chr(143) => 'o',
chr(197) . chr(144) => 'O', chr(197) . chr(145) => 'o',
chr(197) . chr(146) => 'OE', chr(197) . chr(147) => 'oe',
chr(197) . chr(148) => 'R', chr(197) . chr(149) => 'r',
chr(197) . chr(150) => 'R', chr(197) . chr(151) => 'r',
chr(197) . chr(152) => 'R', chr(197) . chr(153) => 'r',
chr(197) . chr(154) => 'S', chr(197) . chr(155) => 's',
chr(197) . chr(156) => 'S', chr(197) . chr(157) => 's',
chr(197) . chr(158) => 'S', chr(197) . chr(159) => 's',
chr(197) . chr(160) => 'S', chr(197) . chr(161) => 's',
chr(197) . chr(162) => 'T', chr(197) . chr(163) => 't',
chr(197) . chr(164) => 'T', chr(197) . chr(165) => 't',
chr(197) . chr(166) => 'T', chr(197) . chr(167) => 't',
chr(197) . chr(168) => 'U', chr(197) . chr(169) => 'u',
chr(197) . chr(170) => 'U', chr(197) . chr(171) => 'u',
chr(197) . chr(172) => 'U', chr(197) . chr(173) => 'u',
chr(197) . chr(174) => 'U', chr(197) . chr(175) => 'u',
chr(197) . chr(176) => 'U', chr(197) . chr(177) => 'u',
chr(197) . chr(178) => 'U', chr(197) . chr(179) => 'u',
chr(197) . chr(180) => 'W', chr(197) . chr(181) => 'w',
chr(197) . chr(182) => 'Y', chr(197) . chr(183) => 'y',
chr(197) . chr(184) => 'Y', chr(197) . chr(185) => 'Z',
chr(197) . chr(186) => 'z', chr(197) . chr(187) => 'Z',
chr(197) . chr(188) => 'z', chr(197) . chr(189) => 'Z',
chr(197) . chr(190) => 'z', chr(197) . chr(191) => 's'
];
$string = strtr($string, $chars);
return $string;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment