Partage
  • Partager sur Facebook
  • Partager sur Twitter

preg_match_all sans .

Sujet résolu
29 novembre 2021 à 10:05:28

Bonjour,

J'utilise actuellement cette fonction de cette façon

preg_match_all(
	'@\S+@',
	$contenus__,
	$matches,
	PREG_PATTERN_ORDER
);

Cela me permet de récupérer dans une chaine de texte des variables. Cela peux ressembler à ça :

Bonjour @civ@ @prenom@ @nom@

Avec cette chaine ça marche mais si j'ai un mail qui traine par exemple, ça fausse tout, je cherche donc à dire que je doit récupérer tout ce qui ce trouve entre des @@ mais qui ne contient ni espace ni . (ou que l'alphabet et du numérique)

exemple @ee@ => ok

sss@sss.fr => Non

Bonjour @ j'ai faim => Non

Donc une chaine du genre :

-------------------------------------------------------------

Bonjour @civ@ @prenom@ @nom@

Voici mes coordonnées : nicolas@nicolas.fr

@monsite

Bien cordialement

@madenom@

-------------------------------------------------------------

Donc ici, je dois récupérer que

@civ@
@prenom@
@nom@
@madenom@

Merci d'avance pour votre aide :)

  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2021 à 11:27:57

Bah change ton \S (tout ce qui n'est pas un caractère d'espacement) en \w ou la classe qui te convient.

PS : je ne comprends pas pourquoi on trouve un preg_match_all à un preg_replace_callback sur ton code

-
Edité par julp 29 novembre 2021 à 11:29:20

  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2021 à 14:59:50

Bonjour,

J'ai essayé mais il me sort chaque balise l'une après l'autre.

Bah c'est un bout de code que j'ai  trouvé qui correspondait bien à me problématique mais l'ajout des . et autre (comme expliqué en début) me pose problème.

J'ai bien tenté de lire le guide mais c'est pas simple.

Cordialement

  • Partager sur Facebook
  • Partager sur Twitter
29 novembre 2021 à 16:11:48

Ah mais tu as oublié de mettre un délimiteur à ta regexp, du coup ce sont les @ qui servent de délimiteurs, ne faisant pas partie du motif c'est normal que le preg_match_all resorte tous les "mots".

'~@\w+@~'

-
Edité par julp 29 novembre 2021 à 16:15:20

  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2021 à 8:50:36

Bonjour,

J’obtiens plus rien en ajoutant ce symbole :(

Voici mon code pour obtenir cela 

$contenus__ = " <span style="font-family: Verdana; font-size: 11pt;">dzd<br />dzdz<br /><br />@nomcli@<br /><br />sss@ededde.fr<br /><br />sss</span>";

preg_match_all(
                        '~@\W+@~',
                        $contenus__,
                        $matches,
                        PREG_PATTERN_ORDER
                    );
                    
                    if(!array_key_exists(0, $matches)){
                        $matches[0]=array();
                    }
                    if(count($matches[0]) > 0){
                        foreach($matches[0] as $val){
                            echo $val;
                        }
                    }
                    var_dump($matches);


Merci beaucoup pour ton temps :)



  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2021 à 11:31:13

Euh, pourquoi tu as écrit \W (un caractère non alpha-numérique ni _) quand je te proposais \w (un caractère alpha-numérique ou underscore) ?!?

Les classes PCRE, quand elles sont en majuscules, étant niées (\W = [^\w]/\w= [^\W]), forcément, ça ne donnera pas le même résultat ...

-
Edité par julp 30 novembre 2021 à 11:35:54

  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2021 à 15:12:18

Bonjour,

Je comprend pas du tout le procédé :(

  • Partager sur Facebook
  • Partager sur Twitter
2 décembre 2021 à 15:50:43

Qu'entends-tu par "procédé" ? Surtout que j'avais donné la regexp, il n'y avait qu'à la copier/coller en principe.

Quel code ? Tu obtiens quoi ? Quand tu veux quoi ?

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2021 à 15:42:49

Bonjour,

Merci pour ta réponse et ta patience, le code est celui-ci :

$contenus__ = " <span style="font-family: Verdana; font-size: 11pt;">dzd<br />dzdz<br /><br />@nomcli@<br /><br />sss@ededde.fr<br /><br />sss</span>";
 
preg_match_all(
                        '~@\W+@~',
                        $contenus__,
                        $matches,
                        PREG_PATTERN_ORDER
                    );
                     
                    if(!array_key_exists(0, $matches)){
                        $matches[0]=array();
                    }
                    if(count($matches[0]) > 0){
                        foreach($matches[0] as $val){
                            echo $val;
                        }
                    }
                    var_dump($matches);

Par "procédé", je ne comprend pas du tout le contenu des regexp

Merci encore

  • Partager sur Facebook
  • Partager sur Twitter
3 décembre 2021 à 16:07:10

Je repose la question : pourquoi as-tu écrit \W avec une majuscule ? Dans mes réponses, il était en minuscule (\w) parce que ça ne désigne absolument pas la même chose (son contraire en fait). \w désigne un caractère alphanumérique ou _ ; \W, l'inverse (un caractère qui n'est ni alphanumérique ni _), donc ce serait dès lors normal que tu ne matches rien.

-
Edité par julp 3 décembre 2021 à 16:24:26

  • Partager sur Facebook
  • Partager sur Twitter
6 décembre 2021 à 12:05:46

Ha c'est bon (en effet, il suffisait de le mettre en minuscule) merci de ta patience :)

  • Partager sur Facebook
  • Partager sur Twitter