Remplacement par RegEx

yoanpg 130 Messages postés dimanche 15 février 2009Date d'inscription 24 septembre 2018 Dernière intervention - 15 mai 2017 à 18:43 - Dernière réponse : Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention
- 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 

Votre réponse

8 réponses

cs_stay 496 Messages postés jeudi 7 juillet 2005Date d'inscription 24 mai 2017 Dernière intervention - 18 mai 2017 à 18:28
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
yoanpg 130 Messages postés dimanche 15 février 2009Date d'inscription 24 septembre 2018 Dernière intervention - 18 mai 2017 à 19:03
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
Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 18 mai 2017 à 21:24
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 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 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.
yoanpg 130 Messages postés dimanche 15 février 2009Date d'inscription 24 septembre 2018 Dernière intervention > Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 18 mai 2017 à 21:47
Yes ça marche avec callback !
Merci beaucoup pour votre aide :)
Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 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 ) );
?> 
yoanpg 130 Messages postés dimanche 15 février 2009Date d'inscription 24 septembre 2018 Dernière intervention > Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 18 mai 2017 à 21:49
Ouai c'est ce que j'ai fait.
Je connaissais pas la fonction de callback, merci !
Whismeril 12032 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 23 septembre 2018 Dernière intervention - 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!
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.