Remplacement par RegEx

Messages postés
138
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
6 septembre 2019
- - Dernière réponse : Whismeril
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
- 18 mai 2017 à 21:56
Bonjour à tous,

Je voudrais le pattern _xxx_ par le caractère correspondant au code ASCII xxx
J'ai utilisé le code suivant :
preg_replace("/_(\d{1,3})_/",chr(int("\1")), $variable)


Le pattern est bien trouvé mais est remplacé par rien (donc supprimer de mon expression).

Avec le code suivant c'est pareil, remplacé par rien:
preg_replace("/_(\d{1,3})_/","\1", $variable)


Qu'est ce que je fais mal pour pouvoir faire mon remplacement ?
Merci d'avance de votre aide :)
Afficher la suite 

3 réponses

Messages postés
496
Date d'inscription
jeudi 7 juillet 2005
Statut
Membre
Dernière intervention
24 mai 2017
2
0
Merci
J'ai pas très bien compris ta première phrase.
Par contre avec la deuxième, si tu veux remplacer un décimale par ce que tu veux. Fais ceci :

<?php
$s_var = 'Un "_65_" comme Arthur.';
echo preg_replace("/_(\d{1,3})_/", 'A', $s_var);
// Affiche Un "A" comme Arthur.


Ou bien remplacer un string par ce que tu veux. Fais ceci :

$s_var = 'Arthur a "_A_" ans.';
echo preg_replace("/_(\w{1})_/", '65', $s_var);
// Affiche, Arthur a "65" ans.


Il y a plein de façon de faire.

$a_ascii = array(
    '_65_' => 'A',
    '_66_' => 'B',
    '_67_' => 'C'
    // etc...
);
$s_txt = 'Un "_65_" comme Arthur ou un "_67_" comme Célia.';
echo strtr($s_txt, $a_ascii);
// Affiche, Un "A" comme Arthur ou un "C" comme Célia.


C'est ça que tu cherchais ?
Commenter la réponse de cs_stay
Messages postés
138
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
6 septembre 2019
3
0
Merci
Merci cs_stay pour ta réponse. En effet j'avais oublié un mot, c'est bien un remplacement que je veux faire.

Ta méthode fonctionnerait en effet, mais je voudrais éviter de définir manuellement une array pour le remplacement, en réutilisant la chaine cherché dans le remplacement.

En fait j'ai trouvé comment faire, le code correct était:
preg_replace("/_(\d{1,3})_/","$1", $variable)

avec un $ à la place du /
Et codant ça, il me remplace bien _xxx_ par xxx (xxx étant mon nombre cherché)

Par contre je n'arrive toujours pas à convertir ce nombre en caractère. Si je code
preg_replace("/_(\d{1,3})_/",intval("$1"), $variable)

il me renvoie 0 à la place de mon nombre xxx

Et si je code
preg_replace("/_(\d{1,3})_/",chr("$1"), $variable)

le caractère retourné est rien (correspondant au code caractère 0)

Merci d'avance
Commenter la réponse de yoanpg
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
308
0
Merci
Bonsoir

je ne code pas en PHP, mais les Regex je connais.
Quand je vois
intval("$1")
ou
chr("$1")
ce qui me vient à l'esprit c'est que tu envoie littéralement "$1" à ces 2 fonctions. Et donc logiquement "$1" ne se converti ni en int ni en char.

En cherchant un peu, j'ai trouvé ce tuto http://php.net/manual/fr/function.preg-replace.php
Dans l'exemple 2, il initialises 2 tableau, un pour les paterns et un pour les valeurs de remplacement (ça revient un peu à ce que propose stay).
Tu pourrais faire un truc du style
Pour i allant de 65 à 90
{
patterns[i-65] = "/_" & i & "_/"
remplacement[i-65] = chr(i)
}


Whismeril
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
308 -
Ha j'ai trouvé ça
http://php.net/manual/fr/function.preg-replace-callback.php

Il faut que tu ta fonction de callback fasse la conversion.
yoanpg
Messages postés
138
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
6 septembre 2019
3 > Whismeril
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
-
Yes ça marche avec callback !
Merci beaucoup pour votre aide :)
Whismeril
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
308 -
J'ai tapé "preg_replace_callback online tester" dans mon moteur de recherche favori et je suis tombé sur un site dédié.
Après quelques bidouilles, pour comprendre PHP

 <?php
function callbackFunction( $matches) {
return chr((int)$matches[1]);
}
$pattern = '/_(\\d{1,3})_/';
$subject = 'Un _65_ comme Arthur ou un _67_ comme Célia.';
print_r( preg_replace_callback($pattern, 'callbackFunction', $subject, -1 ) );
?> 
yoanpg
Messages postés
138
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
6 septembre 2019
3 > Whismeril
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
-
Ouai c'est ce que j'ai fait.
Je connaissais pas la fonction de callback, merci !
Whismeril
Messages postés
13818
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 octobre 2019
308 -
De rien, ça existe en C# alors y'avait pas de raison pour que ça n'existe pas en PHP!
Commenter la réponse de Whismeril