Remplacement par RegEx

yoanpg
Messages postés
145
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 février 2021
- 15 mai 2017 à 18:43
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
- 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 :)
A voir également:

3 réponses

cs_stay
Messages postés
493
Date d'inscription
jeudi 7 juillet 2005
Statut
Membre
Dernière intervention
24 mai 2017
3
18 mai 2017 à 18:28
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 ?
0
yoanpg
Messages postés
145
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 février 2021
3
18 mai 2017 à 19:03
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
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
18 mai 2017 à 21:24
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)
}


0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
18 mai 2017 à 21:27
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.
0
yoanpg
Messages postés
145
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 février 2021
3 > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

18 mai 2017 à 21:47
Yes ça marche avec callback !
Merci beaucoup pour votre aide :)
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
18 mai 2017 à 21:43
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 ) );
?> 
0
yoanpg
Messages postés
145
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
22 février 2021
3 > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

18 mai 2017 à 21:49
Ouai c'est ce que j'ai fait.
Je connaissais pas la fonction de callback, merci !
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
18 mai 2017 à 21:56
De rien, ça existe en C# alors y'avait pas de raison pour que ça n'existe pas en PHP!
0