Php: ¿cómo reemplazar números romanos en una cadena con números enteros?

programación


Tengo una cadena que contiene palabras y uno o más números romanos del uno (I) al diez (X).
Necesito reemplazar esos números con números enteros.

Esto es lo que probé:

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);

Pero no funciona: “VII” se reemplaza por “511” en lugar de “7”.

¿Cómo puedo arreglarlo?

Lo que he probado:

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);

Solución 2

Como se documenta en PHP: str_replace – Manual[^], str_replace() partidos del primero al último.
Para hacer lo que desea, debe colocar todas las cadenas de búsqueda ANTES de cualquier prefijo de ellas, por lo que un orden como

IV IX III II I VIII VII VI V X

Deberia trabajar.

Solución 3

Además de lo anterior y su comentario –

Su problema es que ‘str_replace’ realiza reemplazos en el orden en que aparecen en su matriz como se mencionó anteriormente. Puedes usar la función ‘strtr’ (Función PHP strtr[^]) junto con una función de reemplazo personalizada para devolver el reemplazo correcto, probado con todos los elementos de la matriz en Editor de 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>

Devuelve ‘palabra palabra 9 palabra…’

コメント

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