phpInfo.netLes ArchivesLes éléPHPants

  
  Accueil
  Trucs & Astuces
  Scripts
  Regex
  Annuaire
  Articles

.
      
 Astuces   PHP  Expressions régulières


Variable au format numéro téléphone[29-05-2002]
Posté par Christian Remy

Fonction servant à transformer le résultat d'une variable $tel au format d'un numéro de téléphone à 10 chiffres

<?php

function NumTel($tel)
{
    
$ch = 10;                               // Numéro à 10 chiffres
    
$tel = eregi_replace('[^0-9]',"",$tel); // supression sauf chiffres
    
$tel = trim($tel);                      // suppression espaces avant et après
    
if (strlen($tel) > $ch)
    {
        
$d = strlen($tel) - $ch; // retrouve la position pour ne garder
                                 // que les $ch derniers
    
}
    else
    {
        
$d = 0;
    }
    
$tel = substr($tel,$d,$ch); // récupération des $ch derniers chiffres
    
$regex = '([0-9]{1,2})([0-9]{1,2})([0-9]{1,2})([0-9]{1,2})([0-9]{1,2})$';
    
$newtel = eregi_replace($regex,
        
'\\1-\\2-\\3-\\4-\\5',$tel); // mise en forme
    
return $newtel; /* Exemple : 03-81-51-45-78  */
}

// Appel de la fonction:

echo "Téléphone : ".NumTel($teldom);

?>


[1 commentaire]

Valider une url[14-04-2002]
Posté par Doud

Pour vérifier la cohérence d'une url, on peut vérifier qu'il y a bien le http:// au
début puis au moins un caractère, puis un '.' puis de nouveau au moins un caractère et enfin un '.fr' ou '.com' ou '.net' ou bien '.org'.

<?
function testUrl($Url)
{
  
$r="^http://([_a-zA-Z0-9])+(\.[_a-zA-Z0-9])+(\.fr)|(\.com)|(\.org)|(\.net)";
  if (
eregi($r, $Url))
    return (
1); //valide
  
else
    return (
0); //non valide
}

?>


Templates[02-03-2002]
Posté par Sam Thery

Petite astuce pour remplacer tous les [VARIABLE] par la valeur de $VARIABLE. Permet au graphiste de créer / reprendre ses pages HTML sans toucher au code PHP, et inversement ;-)

Par exemple : [TITRE] sera remplacé par la valeur de $TITRE.

<?php
function template($chaine)
{
  
$chaine = ereg_replace("\[([^]]+)\]","\$GLOBALS[\\1]",$chaine);
  eval(
"\$chaine = \"".addslashes($chaine)."\";");
  return
stripslashes($chaine);
}
?>


Affichage suivant le client[04-03-2001]
Posté par Frank JAMOIS

Voilà une 'regex' qui permet d'afficher un contenu suivant le navigateur :

<?
if (ereg('MSIE', $HTTP_USER_AGENT) &&
   !
ereg('Opera', $HTTP_USER_AGENT))
    
// Internet Explorer
    
echo "le client est Internet Exploreur";
elseif (
ereg('Opera', $HTTP_USER_AGENT))
    
// Opera
    
echo "le client est Opera";
elseif (
ereg('Mozilla/4.', $HTTP_USER_AGENT))
    
// Netscape 4.x
    
echo "le client est Netscape 4.x";
elseif (
ereg('Mozilla/5.0', $HTTP_USER_AGENT) &&
       !
ereg('Konqueror', $HTTP_USER_AGENT))
    
// NS 6
    
echo "le client est Netscape 6.x";
else
    
// others
    
echo "le client est non reconu";
?>


[2 commentaires]

Indentation[13-02-2001]
Posté par Frédéric Bouchery

Voici une astuce pour garder l'indentation d'un texte lors d'une "sortie" HTML :

<?
$txt
= preg_replace('/ (?= )/s','&nbsp;',$txt);
?>

On utilise les expressions régulières compatibles Perl avec une assertions avant.
Vous pouvez ajouter aussi :

<?
$txt
= nl2br($txt);
?>

pour transformer les retours chariot en "<BR>".

L'avantage de cette astuce, c'est qu'une phrase peut revenir à la ligne automatiquement. C'est mieux que d'utiliser les balises "<PRE>" ou de remplacer tous les espaces par des espaces insécable (&nbsp;).

Conversion "tolérante" en date mySQL[11-01-2001]
Posté par Frédéric Bouchery

Voici une manière de contrôler les dates saisies par vos utilisateurs avec une expression régulière trés "tolérante". Les champs de la date peuvent être séparés par des "/", des ="-", des "." ou des espaces. On accepte des espaces suplémentaires entre chaque chiffre et l'année peut être sur 1, 2 ou 4 chiffres. Si la date n'est pas sur 4 chiffres, on part du principe que l'on fait référence à l'année 2000.
Il y a également un contrôle de cohérence (pas de 30 février par exemple).

Si la fonction ne renvoie rien (false), on retrouve l'erreur dans la variable $erreur.

<?
function mySQLDate($date,&$erreur)
{
  
$ereg  = '^[ ]*([0-9]{1,2})[ ]*[ /.-][ ]*([0-9]{1,2})[ ]';
  
$ereg .= '*[ /.-][ ]*([0-9]{1,2}|[0-9]{4})[ ]*$';

  if (
ereg($ereg, $date, $tab))
  {
    if(
strlen($tab[3])< 4) $tab[3] = sprintf('20%02d',$tab[3]);
    
$mkt = mktime(0,0,0,$tab[2],$tab[1],$tab[3]);
    
$result = date('Y-m-d',$mkt);
    
$saisie = sprintf ('%04d-%02d-%02d',$tab[3],$tab[2],$tab[1]);
    
    if (
$result != $saisie)
      
$erreur = "Vérifiez la date. C'est peut être le ".date('d/m/Y',$mkt);
    else
      return
$result;
  }
  else
  {                    
    
$erreur = 'Format de date invalide';
  }
?>


Extraire le dernier élément d'un nom de domaine[03-12-2000]

Voici une expression régulière qui permet de récupérer d'un hostname ou d'un nom de domaine le dernier élément qui correspond au pays (quand il ne s'agit pas d'un .com, un .net, un .org ...).

<?
$chaine
= "www.phpinfo.net";
echo
ereg_replace("^(.*).(.*)$", "\\2", $chaine);
?>


Censurer certains mots dans un texte[29-11-2000]

Voici un extrait du code de Phorum qui permet de bannir d'un texte certains mots (durs à l'oreille), en les remplaçant par la séquence de votre choix.

<?
$blurb
= "@!#$";

$message  = "Mais où est passée la clé de la maison.\n";
$message .= "Je ne la perds jamais !!\n";
$message .= "Mais elle est là !\n";

$bannir = "mais";

if (
strstr(strtoupper($message), strtoupper($bannir))) {
  if (
strtoupper($message) == strtoupper($bannir))
    
$message=$blurb;
  
$message = eregi_replace("^$bannir([^a-zA-Z])", "$blurb\\1", $message);
  
$message = eregi_replace("([^a-zA-Z])$bannir$", "\\1$blurb", $message);
  
  while(
eregi("([^a-zA-Z])($bannir)([^a-zA-Z])", $message)){
    
$message = eregi_replace("([^a-zA-Z])($bannir)([^a-zA-Z])",
                             
"\\1$blurb\\3", $message);
  }
}

echo
$message;
?>

Deuxième méthode (merci Fred) :

<?
$bannir
= "mais|clé";

echo
preg_replace("/(^|[^a-zA-Z])($bannir)([^a-zA-Z]|$)/si",
                  
'\\1'.$blurb.'\\3',$message);
?>


Ne garder que le corps d'un fichier HTML[29-11-2000]
Posté par Frédéric Bouchery

Cette expression régulière extrait le texte compris entre les balises <HTML>...<BODY> et </BODY></HTML>.

<?
$body
=
eregi_replace('(^.*<html[^>]*>.*<body[^>]*>)|(</body[^>]*>.*</html[^>]*>.*$)',
              
'', $texte);
?>


Rendre des urls d'un texte cliquables[20-08-2000]

Pour rendre cliquables les URLs contenues dans un texte, utilisez l'expression régulière suivante :

<?
  $texte
= eregi_replace(
    
"([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])",
    
"<A HREF=\"\\1://\\2\\3\" TARGET=\"_blank\">\\1://\\2\\3</a>",
    
$texte);
?>


[1 commentaire]

Retour-Charriot et TEXTAREA[20-08-2000]

L'élément HTML TEXTAREA permet dans un formulare de saisir du texte sur plusieurs lignes. La plupart des navigateurs code le saut de ligne par \r\n.
Mais certains préfèrent \n, d'autres \r !

Voici une expression régulière qui mettra tout le monde d'accord :

<?
$textarea_texte
= ereg_replace("(\r\n)|(\n)|(\r)", "\n", $textarea_texte);
?>


Vérifier qu'une variable contient un entier[20-08-2000]

Utilisez l'expression régulière suivante pour vérifier qu'une variable contient une valeur entière :

<?
if ( ereg("^[0-9]+$", $variable) ) {
echo
"C'est un entier";
}
?>


[2 commentaires]

Anti-spam[24-05-2000]

Voici une fonction qui permet de transformer une adresse email dans une page web en son équivalent en codes ASCII :

<?
  
function no_spam($email) {
    
$cars = array(
              
"A","B","C","D","E","F","G","H","I","J",
              
"K","L","M","N","O","P","Q","R","S","T",
              
"U","V","W","X","Y","Z", "a","b","c","d",
              
"e","f","g","h","i","j","k","l","m","n",
              
"o","p","q","r","s","t","u","v","w","x","y",
              
"z", "@");

    
$htmls = array(
              
"65","66","67","68","69","70","71","72","73","74",
              
"75","76","77","78","79","80","81","82","83","84",
              
"85","86","87","88","89","90",
              
"97","98","99","100","101","102","103","104","105",
              
"106","107","108","109","110","111","112","113","114",
              
"115","116","117","118","119","120","121","122","64");

    for (
$i = 0; $i < $nbcars = count($cars); $i++)
      
$email = ereg_replace($cars[$i], "&#$htmls[$i];", $email);

    print
$email;
  }
?>


[2 commentaires]

Nettoyer une chaîne[21-05-2000]

Pour supprimer dans une chaîne les caractères non-alphanumériques (c.à.d. différents de a-z, A-Z, 0-9), nous pouvons utiliser les expressions régulières :

<?
  $chaine
= "56è[(qsADFqs f]f GD sd fd-sdf45-*85qs";
  echo
eregi_replace("[^a-z0-9]", "", $chaine)."<BR>";
?>

L'exemple suivant permet de conserver aussi les espaces :

<?
echo eregi_replace("[^a-z0-9\ ]", "", $chaine);
?>


Vérifier la validité (syntaxique) d'une adresse email[19-05-2000]

Une petite fonction qui vérifie la validité syntaxique d'une adresse email en utilisant les expressions régulières :

<?
function EmailOK($email) {
  
  return(
ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.
               
'@'.
               
'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.
               
'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$',
               
$email) );
}

$email = "nom.prenom@herbergeur.fr";
echo
"$email:".EmailOK($email)."<BR>\n";

$email = "nom.prenom@herbergeur";
echo
"$email:".EmailOK($email)."<BR>\n";

$email = "nom.prenom_herbergeur.fr";
echo
"$email:".EmailOK($email)."<BR>\n";
?>


Synseo