[PHP] Regexp, remplacer une chaine après X caractères [Résolu/Fermé]

Signaler
-
 Quo -
Bonjour,

J'essaye de remplacer une partie d'une chaine de caractère qui se trouve après au moins 40 caractère du début de la chaine . Mais je patine un peu car le regexp est loin d'être ma spécialité.

Voici le plus loin que je sois arrivé jusqu'à présent :
preg_replace('/[.]{40,}Ancienne chaine/', 'Nouvelle chaine', $chaine);
Malheureusement ça ne marche pas (je ne serais pas la sinon) et aucune des variations que j'ai trouvé sur internet jusqu'à présent non plus.

Merci de votre aide.

2 réponses

Messages postés
5577
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 juin 2021
937
Salut Quo,

1.

Tu n'es pas loin :-), la regex correcte est :
/^.{40,}Ancienne chaine/
.

Dans les crochets, le point est compris littéralement comme étant le caractère point. Ce n'est pas ce que tu cherches, puisque tu cherches "tous caractères". Les crochets sont donc inutiles. Le quantificateur est correct pour indiquer "40 ou plus".

Puisque tu cherches à partir du début de la chaîne, j'ai aussi ajouté
^
en début de regex.

2.


cela dit, ceci :

<?php
$chaine = "1234567890123456789012345678901234567890123Ancienne chaine patati, patata";
$nouvelle = preg_replace('/^.{40,}Ancienne chaine/', 'Nouvelle chaine', $chaine);
echo "<p>nouvelle = $nouvelle</p>";
?>

donne :

nouvelle = Nouvelle chaine patati, patata

Si ce que tu veux, c'est bien "remplacer une partie d'une chaine de caractère qui se trouve après au moins 40 caractère du début de la chaine", cela signifie que ce que tu veux, c'est :

nouvelle = 1234567890123456789012345678901234567890123Nouvelle chaine patati, patata

Pour cela, il faudra que tu fasses des captures, comme suit :

$nouvelle = preg_replace('/(^.{40,})(Ancienne chaine)(.*)/', "$1" . "Nouvelle chaine" . "$3", $chaine);


Dal
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Merci beaucoup pour tes explications détaillés, c'est exactement ce que je cherche.
Messages postés
1791
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
15 août 2020
597
Je ne connaissais pas du tout substr_replace tient.

C'est moins pratique qu'une solution en regexp ceci dit puisqu'il faut que je test au préalable l'existence de la chaine a remplacer, mais ça fera l'affaire.

Merci bien, je met le sujet en résolu.