Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

expressions regulieres : faire le contraire

7 réponses
Avatar
bonjour

je souhaiterais ne conserver d'une chaine seulement les parties qui
verifient une expression reguliere

une sorte de ereg_replace inverse en qq sorte

je m'explique. la ligne suivante ne va conserver dans area que tout ce qui
n'est pas toto suivi d'un nombre

$area=ereg_replace("\(toto[0-9]\)","",$area);

hors je voudrais justement que la ligne ejecte tout ce qui n'est pas toto
suivi d'un nombre (il peut y avoir une centaine de toto suivi d'un nombre
dans la chaine et je ne veux garder que ceux la)

je ne sais pas comment faire et je ne trouve rien qui parle de ca
il y a bien le circonflexe d'interdiction dans les classes de caracteres
mais pour les chaines je donne ma langue au chat.

si vous avez des idees, elles sont les bienvenues

--
ampac

7 réponses

Avatar
Paul Delannoy
a écrit:
bonjour

je souhaiterais ne conserver d'une chaine seulement les parties qui
verifient une expression reguliere
une sorte de ereg_replace inverse en qq sorte


Ca c'est la fonction ereg : http://fr.php.net/manual/en/function.ereg.php
ou mieux preg_match :
http://fr.php.net/manual/en/function.preg_match.php

strstr peut aussi se révéler utile si vous ne noules pas sortir les
'totoi' tous d'un seul coup...

Avatar
Antoine Dinimant
a écrit:
je souhaiterais ne conserver d'une chaine seulement les parties qui
verifient une expression reguliere


le raisonnement complet s'est fait au fur et à mesure de la discussion
sur alt.fr.comp.lang.php, mais comme je suis très content de moi :-) je
poste ici la soluttion :


voici une boucle qui marche, sur une regex simplifiée :

<?php
$texte = "fgjkha1lkdsfa2ksdfla3kdf" ;

while (ereg("(a[0-9])", $texte, $resu)) {
$tablofinal[] = $resu[1] ;
$texte = substr($texte, strpos($texte, $resu[1]) + strlen($resu[1])) ;
}

echo "éléments trouvés : <BR>n" . join("<BR>n", $tablofinal) ;

?>

Avatar
Paul Delannoy
Antoine Dinimant a écrit:
a écrit:

je souhaiterais ne conserver d'une chaine seulement les parties qui
verifient une expression reguliere



le raisonnement complet s'est fait au fur et à mesure de la discussion
sur alt.fr.comp.lang.php, mais comme je suis très content de moi :-)


Ah bon, content de réinventer une fonction PHP existante (ereg,
preg_match) ?


Avatar
Eric Daspet
wrote:
je souhaiterais ne conserver d'une chaine seulement les parties qui
verifient une expression reguliere


Tu fais un preg_match (ou preg_match_all, suivant si tu attend un seul
résultat ou plusieurs), puis tu concatènes les résultats trouvés.

une sorte de ereg_replace inverse en qq sorte


De toutes façons je te conseille très fortement d'utiliser les preg
plutot que les ereg, coté performances il y a une nette différence

--
Eric Daspet
Venez aider notre mangeur de cigogne sur http://mangeur-de-cigogne.info/

Avatar
Antoine Dinimant
Ah bon, content de réinventer une fonction PHP existante (ereg,
preg_match) ?


non, de construire la boucle autour. Je ne prétends pas que ça
révolutionne le web, mais c'était le pb posé.

Avatar
Dans news:,
Antoine Dinimant a dit :

while (ereg("(a[0-9])", $texte, $resu)) {
$tablofinal[] = $resu[1] ;
$texte = substr($texte, strpos($texte, $resu[1]) +
strlen($resu[1])) ; }


merci pour cette bonne reponse.

--
ampac

Avatar
Olivier Miakinen

Ah bon, content de réinventer une fonction PHP existante (ereg,
preg_match) ?


non, de construire la boucle autour. Je ne prétends pas que ça
révolutionne le web, mais c'était le pb posé.


Comme le signalait Éric Daspet, il vaut mieux utiliser les preg plutôt
que les ereg, et du coup un preg_match_all() retrouve toutes les
occurrences en une seule fois, sans qu'il soit besoin de construire une
boucle autour.