[PHP] Regexp, remplacer une chaine après X caractères

Résolu
Quo -  
 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.
A voir également:

2 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
Quo
 
Merci beaucoup pour tes explications détaillés, c'est exactement ce que je cherche.
0
meuhlol Messages postés 1896 Date d'inscription   Statut Membre Dernière intervention   673
 
0
Quo
 
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.
0