[ad_1]
J’ai une chaîne qui contient des mots et un ou plusieurs chiffres romains de un (I) à dix (X).
Je dois remplacer ces chiffres par des nombres entiers.
Voici ce que j’ai essayé :
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
Mais ça ne marche pas : « VII » est remplacé par « 511 » au lieu de « 7 ».
Comment puis-je le réparer ?
Ce que j’ai essayé :
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
Solution 2
Comme documenté à PHP : str_replace – Manuel[^], str_replace()
matchs du premier au dernier.
Pour faire ce que vous voulez, vous devez mettre toutes les chaînes de recherche AVANT leurs préfixes, donc un ordre comme
IV IX III II I VIII VII VI V X
devrait marcher.
Solution 3
En plus de ce qui précède et de votre commentaire –
Votre problème est que ‘str_replace’ effectue les remplacements dans l’ordre dans lequel ils apparaissent dans votre tableau, comme mentionné ci-dessus. Vous pouvez utiliser la fonction ‘strtr’ (Fonction PHP strtr[^]) ainsi qu’une fonction de remplacement personnalisée pour renvoyer le remplacement correct, testé avec tous les éléments du tableau dans Éditeur W3Schools[^] –
<!DOCTYPE html> <html> <body> <?php $reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word IX word ..."; function replaceNumerals($matches) { global $reps; return $reps[$matches[0]]; } $str2 = preg_replace_callback('/\b(?:' . implode('|', array_map('preg_quote', array_keys($reps))) . ')\b/', 'replaceNumerals', $str); print_r($str2); ?> </body> </html>
Renvoie “mot mot 9 mot…”
[ad_2]
コメント