Php – comment remplacer les chiffres romains dans une chaîne par des entiers ?

la programmation


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é :

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 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é :

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 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[^] –

HTML
<!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…”

コメント

タイトルとURLをコピーしました