/ / preg_replace avec des paramètres qui se chevauchent - php, regex

preg_replace avec des paramètres qui se chevauchent - php, regex

J'essaie de corriger un script qui divise les voyelles et les suffixes avec un trait d'union.

<?php
$string = "celebrationing";
$patterns = array();
$patterns[0] = "/a/";
$patterns[1] = "/e/";
$patterns[2] = "/i/";
$patterns[3] = "/o/";
$patterns[4] = "/u/";
$patterns[5] = "/tion/";

$replacements = array();
$replacements[0] = "-a";
$replacements[1] = "-e";
$replacements[2] = "-i";
$replacements[3] = "-o";
$replacements[4] = "-u";
$replacements[5] = "-tion";

echo preg_replace($patterns, $replacements, $string);


?>

Le script fonctionne bien pour les voyelles, mais quand je viens au suffixe -tion, il n’imprime pas le trait d’union.

Sortie: c-el-ebr-at-i-on-ing

Ce que je pense, c'est que -i et -o sont des voyelles, mais ce qui gâche tout le processus.

Comment autoriser la reconnaissance des six modèles, avec tous les exemples de -tion dépassant -i et -o?

Réponses:

6 pour la réponse № 1

Vous pouvez utiliser un regex plus simple:

preg_replace("/tion|[aeiou]/", "-$0", $string);

regex101 démo

La regex tente d'abord de faire correspondre tion ce qui empêche ainsi l’appariement des i et o plus tard dans le même match.


2 pour la réponse № 2

Pas aussi élégante que la solution de Jerry, celle-ci utilise les mots négatifs suivants:

<?php

$string = "celebrationing";
$patterns = array();
$patterns[0] = "/a/";
$patterns[1] = "/e/";
$patterns[2] = "/i(?!on)/";
$patterns[3] = "/o(?<!ti)(?!n)/";
$patterns[4] = "/u/";
$patterns[5] = "/tion/";

$replacements = array();
$replacements[0] = "-a";
$replacements[1] = "-e";
$replacements[2] = "-i";
$replacements[3] = "-o";
$replacements[4] = "-u";
$replacements[5] = "-tion";

echo preg_replace($patterns, $replacements, $string);

OUPUT:

c-el-ebr-a-tion-ing