1) Enlever certains mots
posté par Yves Maistriaux (ID : 8)
Regex permettant de bannir (ôter) certains mots d'un texte (insultes, injures, etc...) et les remplacer par un autre mot.
Utilise la fonction preg_replace
<?php
$message="Un petit test pour enlever des mots interdit,
genre enfoiré, connard et bien d'autres merdes
du même genre";
$interdit='enfoiré|connard|merde|salaud';
$autre='lol';
$message2 = preg_replace('`(^|\W)('.$interdit.')(\W|$)`si','$1 '.$autre.' $3', $message);
echo $message;
?>
2) Enlever certains mots V2
posté par Yves Maistriaux (ID : 9)
Version améliorée - Enlève certains mots d'un texte en tenant compte de la casse, la gestion du pluriel.
Utilisation des ancrages de limite de mot \b (assertion simple)
<?php
$message='Salaud, c\'est un petit test pour enlever des mots interdits,
genre enfoirés, connard et bien d\'autres
merdes même genre';
$interdit='enfoiré|connard|merde|salaud';
$autre='*****';
$message1 = preg_replace('`\b('.$interdit.')[sx]?\b`si',$autre, $message);
echo '<br>',$message1;
?>
3) Mettre du texte en forme entre balises perso
posté par Yves Maistriaux (ID : 10)
Cette regex permet de mettre en forme du texte (gras, couleur, etc..) seulement s'il est placé entre des balises persos.
Très simple !
Petite explication peut-être : le $1
Cela s'appele une référence arrière et peut être écrite sous cette forme aussi : \\1
<?php
//--- le texte
$message = "Un petit test pour [forme] trouver des textes [/forme]
à mettre en forme, <br />seulement s'il sont placés
[forme] entre des balises perso [/forme] comme dans cette phrase ";
echo 'Texte original :<br />',$message,'<br />';
//--- la regex ---//
$message=preg_replace('`\[forme]([^[]+)\[/forme]`s',
'<font color="#FF0000"><b>$1</b></font>',
$message);
echo '<br />Le résultat de cette regex :<br />'. $message.'<br />';
?>
4) Trouver des mots dans une chaine...
posté par Yves Maistriaux (ID : 11)
Permet de trouver les termes dans une chaine / texte qui sont placés entre des balises persos et les récupérer dans un tableau. Balise perso utilisée ici le %
Fonction utilisée : preg_match_all
<?php
//--- texte ---//
$texte = "Un petit test pour %trouver% dans un texte %des mots% ";
$texte .= "qui sont %placés% comme ici %entre% une serie de %balises persos% ";
$texte .= "pour ensuite %les récupérer% et les placer %dans un tableau% et voilà";
//--- la regex ---//
$texte = preg_match_all( "/%(.*)%/Us" , $texte, $mots);
foreach($mots[1] as $val)
{
echo "Trouvé : $val <br />";
}
//Ce qui affichera ==>
//trouvé : trouver
//trouvé : des mots
//trouvé : placés
//trouvé : entre
//trouvé : balises persos
//trouvé : les récupérer
//trouvé : dans un tableau
?>
5) Tester une extension de fichier
posté par Yves Maistriaux (ID : 13)
Petite regex permettant de vérifier un nom de fichier et son extension. utilise la fonction eregi.
//- Explication -//
- on vérifie si le nom du fichier ne contient rien d'autre que des lettres, des chiffres
exemple : image.gif
- une seule fois le tiret - ou l'underscore _ entre les lettres/chiffres
exemple : image-truc.gif ou image_truc.gif
- maintenant, le tiret et l'underscore peuvent se suivre
exemple : image-_truc.gif
- par contre ceci sera refusé : ima-ge_truc.gif
<?php
//--- test sur un fichier image
$fichier="une_image.gif";
if(eregi("^[a-z0-9]+[-_]*[a-z0-9]*(\.(gif|jpe?g|png))$",$fichier))
{
echo "extension correcte";
} else {
echo "extension fausse";
?>
6) Mettre des mots en évidence
posté par Yves Maistriaux (ID : 42)
Petite regex permettant de mettre des mots en évidence dans un texte sans tenir compte de la casse.
Dans notre exemple, le mot sera affiché avec un background en jaune.
<?php
$texte='Les regex pour php c\'est sympa, mais on trouve aussi des regex pour mysql';
$mot='regex';
$motif='`(.*?)('.$mot.')(.*?)`si';
$sortie='$1<span style="background-color:#ffcc00">$2</span>$3';
echo preg_replace($motif,$sortie,$texte);
?>
7) Mettre en évidence une série de chiffres dans un texte
posté par Yves Maistriaux (ID : 51)
Petite regex permettant de mettre en évidence une série de chiffres dans un texte.
Dans le cas présent j'utilise simplement la balise < b > et < /b >.
L'idéal bien évident est d'user de balises de style genre
.
<?php
$texte='Une série de chiffres comme 895 et aussi 2, ainsi que 85 qui doivent être en gras!';
$motif='`(.*?)(\d+)(.*?)`';
$sortie='$1<b>$2</b>$3';
echo preg_replace($motif,$sortie,$texte);
?>
8) Un simple test de mot de passe
posté par Yves Maistriaux (ID : 52)
Une simple vérification avec preg_match sur un mot de passe.
On accepte chiffres et lettres, minimum de 4 caractères et maximum de 8.
<?php
$passe='toto1234';
if(!preg_match('`^([[:alnum:]]{4,8})$`',$passe))
{
echo "c'est pas bon";
}
else
{
echo "Test avec preg_match : c'est bon !";
}
?>
9) Césure de mots trop long V1
posté par Yves Maistriaux (ID : 65)
Fonction permettant de faire une césure sur des mots trop longs tapés dans des zonnes de texte comme un forum par exemple.
<?php
function coupe_mot($ch,$longueur=15,$inserer=' ')
{
return preg_replace('`([^\s]{'.$longueur.'})`','$1'.$inserer,$ch);
}
$test = 'Unmotbientroplongécritparunenfoirédansunforum
suivi d\'un autre tout simple';
echo coupe_mot($test);
?>
10) Césure de mots trop long V2
posté par Yves Maistriaux (ID : 66)
Même source que la version 1 mais dans celle-çi on tient compte d'un balisage html éventuel, ceci, afin de ne pas appliquer la césure au milieu des balises html
<?php
function coupe_mot($ch,$longueur=15,$inserer=' ')
{
return preg_replace('`([^\s<>]{'.$longueur.'})`','$1'.$inserer,$ch);
}
$test = 'Unmotbientroplongécritparunenfoirédansunforum
suivi d\'un autre entre balise html
<strong><u><i>unmotvraimenténormedanscetexte</i></u></strong>
et un dernier mottrèslongbeaucouptroplongàcouper';
echo coupe_mot($test);
?>
11) Césure sur répétition de lettres identiques V1
posté par Yves Maistriaux (ID : 67)
Cette regex permet de réduire des mots tapés par l'internaute comportant une série de lettres identiques à la queue-leu-leu.
Exemple :
Saluuuuuuuuuuuuuuuuuuuuuuuuuuut !
Bonjouuuuuuuuuuuuuuuuuuuuuuur !
Ouuuuuuuuaaaaaaaaaaaaaaah !
La regex que je donne travaille au travers d'un test réalisé sur le texte afin de savoir s'il y a des mots trop longs
preg_match(); et preg_replace();
<?php
$chaine ='Bonjourrrrrrrrrrrrrrrrrrrrr, il y a des mots trop
long qui vont être coupés à l\'affichage.
<br />
Houlaaaaaaaaaaaa, mais ça marche';
if(preg_match('`(.)(\1{3,})`',$chaine,$out))
{
echo 'Il y a des mots trop longs, on coupe !<br />';
echo preg_replace('`(.)(\1{3,})`s','$1',$chaine);
}
else
{
echo 'bon';
}
?>
12) Mettre des mots en évidence Version 2
posté par Yves Maistriaux (ID : 83)
Mettre une série de mots en évidence dans un texte.
Liste de mot au départ d'un array()
<?php
$ch='Bon alors voilou, la bonne méthode consiste à limiter les
mots de façon à éviter de prendre une partie, comme sol dans
solide, bravo dans bravoure et bon dans bonne comme au début,
même si BRAVO ou BON sont en majuscules ou encore un mix des
deux et au pluriel comme BrAVoS.';
$mot=array('bravo','bon','sol');
$motif='`\b(('.implode('|',$mot).')s?)\b`si';
$sortie='<span style="background-color:#ffcc00">$1</span>';
echo preg_replace($motif,$sortie,$ch);
?>
13) Mettre des mots en évidence Version 3
posté par Yves Maistriaux (ID : 106)
Cet ensemble de regex (demandée par un internaute sur un forum) permet de mettre en forme (coloriser) des mots trouver dans un texte sans altérer le balisage HTML si d'aventure celui-ci contenait le terme recherché.
On passe la chaine sujet à preg_split() qui, en fonction du masque fourni, éclatera la chaine afin de retourner un tableau en sortie.
Il suffit ensuite de matcher les différents éléments du tableau et de leur appliquer les remplacements voulus.
On peut coloriser plusieurs mots en utilisant une liste avec | ou en faisant un implode avec le même séparateur sur des valeurs passsées en POST par exemple.
$mots_a_trouver='regex|php|mysql';
<?php
$ch='Les regex php, c\'est sympa, mais on trouve des
<a href="regex.php" title="les regex en php">Regex</a> aussi avec mysql.
Un exemple, en image <img src="test.gif" alt="une regex en image" />.';
function marque_mot($ch,$mot)
{
$tab=preg_split('`(<\w+.*?>)`',$ch,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach($tab as $key=>$val){
if(preg_match('`^<\w+`',$val))
{
$tab[$key]=$val;
}
else
{
$tab[$key]=preg_replace('`\b'.$mot.'\b`i',
'<span style="background-color:#ffcc00">$0</span>',
$val);
}
}
return implode($tab);
}
$mot_a_trouver='regex';
echo marque_mot($ch,$mot_a_trouver);
?>
14) Vérifier un nombre
posté par Yves Maistriaux (ID : 107)
On vérifie une valeur fournie par l'internaute et passée via un formulaire.
Un pourcentage qui peut s'exprimer comme ceci
0.1 ou 0,1 à 100
On pourrait le faire avec un is_numeric, mais on accepte ici une virgule ou un point comme séparateur de décimal.
<?php
$ch='2';
if(!preg_match('`^(((100|[1-9]\d?)([,.][1-9]\d?)?)|0[,.][1-9]\d?)$`',$ch))
{
echo 'pas OK';
}
else
{
echo 'OK';
}
?>
15) Césure sur des mots V3
posté par Yves Maistriaux (ID : 110)
Et voiçi encore une autre version de césure sur des mots sans couper les attributs des balises HTML
<?php
$texte = 'Unmotbientroplongécritparunenfoirédansunforum suivi d\'un autre avec balise html
<strong class="pouet" style="background-image;width:130px;"><u><b><i>énorme,
unmotvraimenténormedanscetexte</i></b></u></strong> et un mottrèslongbeaucouptroplong';
$min='25';
function coupe_mot($match,$longueur=15,$inserer='*')
{
return wordwrap($match[1],$longueur,$inserer,1);
}
$texte1=preg_replace_callback('`\b([[:alnum:]]{'.$min.',})\b`','coupe_mot', $texte);
echo htmlentities($texte1);
?>
16) Vérifier une clé RIB
posté par Yves Maistriaux (ID : 128)
A la demande d'un internaute, j'ai été amené à créer une petite regex pour la vérification syntaxique d'une clé RIB
(un truc qu'on a pas en Belgique ça ^^)
<?php
$rib = '69';
if (preg_match('`^(0[1-9]|[1-8]\d|9[0-7])$`', $rib))
{
echo $rib,' --->OK';
}else{
echo $rib,' --->pas OK';
}
?>
17) Mettre des mots en évidence Version 4
posté par Jukien (ID : 108)
En me penchant sur une optimisation de la version 3, je propose une amélioration permettant de coloriser des mots entre les balises, genre
strong que j'ai ajouté dans la phrase d'origine pour le test.
<?php
$ch='Les regex php, c\'est sympa, mais on peut les mettre en
avant avec la balise <strong>strong</strong>.
Un exemple, en image <img src="test.gif" alt="une regex en image" />.';
function marque_mot($ch,$mot)
{
$tab=preg_split('`(</?[a-z]+[^>]*>)`i',$ch,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach($tab as $key=>$val){
if(strpos($val, '<') === 0)
{
$tab[$key]=$val;
}
else
{
$tab[$key]=preg_replace('`\b'.$mot.'\b`i','<span style="background-color:#ffcc00">$0</span>',$val);
}
}
return implode($tab);
}
$mot_a_trouver='strong';
echo marque_mot($ch,$mot_a_trouver);
?>
18) Construction d'une liste à puce [style Wikipedia]
posté par jobherzt (ID : 64)
Cette fonction permet de transformer un texte du type :
un certain texte
[*]element 1
[*]element 2
un autre texte
en
un certain texte
un autre texte
en utilisant les assertions complexes.
<?php
function makeListe($capt)
{
return str_replace("[*]","<li>","<ul>".$capt[0]."</ul>");
}
$texte=preg_replace_callback("#\[\*\].*\n(?!\[\*\])#sU","makeListe",$texte);
?>
19) Un soundex en français
posté par Frédéric Bouchery (ID : 40)
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.
<?php
function soundex2( $sIn )
{
// Si il n'y a pas de mot, on sort immédiatement
if ( $sIn === '' ) return ' ';
// On met tout en minuscule
$sIn = strtoupper( $sIn );
// On supprime les accents
$sIn = strtr( $sIn, 'ÂÄÀÇÈÉÊËŒÎÏÔÖÙÛÜ', 'AAASEEEEEIIOOUUU' );
// 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.
if ( strlen( $sIn ) === 1 ) return $sIn . ' ';
// on remplace les consonnances primaires
$convIn = array( 'GUI', 'GUE', 'GA', 'GO', 'GU', 'CA', 'CO', 'CU',
'Q', 'CC', 'CK' );
$convOut = array( 'KI', 'KE', 'KA', 'KO', 'K', 'KA', 'KO', 'KU', 'K',
'K', 'K' );
$sIn = str_replace( $convIn, $convOut, $sIn );
// on remplace les voyelles sauf le Y et sauf la première par A
$sIn = preg_replace( '`(?<!^)[EIOU]`', 'A', $sIn );
// on remplace les préfixes puis on conserve la première lettre
// et on fait les remplacements complémentaires
$convIn = array( '`^KN`', '`^(PH|PF)`', '`^MAC`', '`^SCH`', '`^ASA`',
'`(?<!^)KN`', '`(?<!^)(PH|PF)`', '`(?<!^)MAC`', '`(?<!^)SCH`',
'`(?<!^)ASA`' );
$convOut = array( 'NN', 'FF', 'MCC', 'SSS', 'AZA', 'NN', 'FF', 'MCC',
'SSS', 'AZA' );
$sIn = preg_replace( $convIn, $convOut, $sIn );
// suppression des H sauf CH ou SH
$sIn = preg_replace( '`(?<![CS])H`', '', $sIn );
// suppression des Y sauf précédés d'un A
$sIn = preg_replace( '`(?<!A)Y`', '', $sIn );
// on supprime les terminaisons A, T, D, S
$sIn = preg_replace( '`[ATDS]$`', '', $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 );
// on ne retient que 4 caractères ou on complète avec des blancs
return substr( $sIn . ' ', 0, 4);
}
?>
20) Compter le nombre de mots dans une chaine
posté par Fabrice Lezoray (ID : 24)
Cette petite portion de code vous permettra de compter le nombre de mots dans une chaine.
Note :
- Si vous disposez de PHP 4.3 ou supérieur, il vaut mieux utiliser str_word_count();
- j' ai inséré plusieurs espaces consécutifs entre les mots pour justifier ici (si il y a lieu) l' utilisation d' une REGEX, car sinon un : echo count(explode(' ', $chaine)); suffirait, mais êtes vous êtes vous sur de la forme de votre chaine ?
<?php
$chaine = 'Un texte contenant 5 mots';
echo count(preg_split('`\\W`', $chaine, -1, PREG_SPLIT_NO_EMPTY));
?>
21) Vérification d' un format MD5
posté par Fabrice Lezoray (ID : 25)
Cette petite portion permet de vérifier la validité d' un format MD5.
- chaine de 32 caractères
- comportant uniquement des lettres minuscules comprises entre a et f [a-f] ou des chiffres [0-9]
<?php
$truc = md5('truc');
// $truc = 'cool';
if(preg_match('`^[a-f0-9]{32}$`', $truc))
echo 'Format valide MD5';
else
echo 'Invalide !!!!!!';
?>