Remplacement par RegEx

yoanpg Messages postés 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 - 15 mai 2017 à 18:43
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 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 :)

3 réponses

cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
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 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 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 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
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 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
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 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
18 mai 2017 à 21:47
Yes ça marche avec callback !
Merci beaucoup pour votre aide :)
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
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 156 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 janvier 2024 3 > Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024
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 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
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
Rejoignez-nous