Invertir la posición de todas las letras en cada palabra de una cadena que pueda contener caracteres de múltiples bytes.
Quiero escribir una aplicación que invierta todas las palabras de un texto de entrada, pero todos los símbolos que no sean letras deben permanecer en el mismo lugar.
Lo que ya tengo:
function reverse($string)
{
$reversedString = '';
for ($position = strlen($string); $position > 0; $position--) {
$reversedString .= $string[$position - 1]; //.= - concatenation assignment, привязывает b to a;
}
return $reversedString;
}
$name = 'ab1 ab2';
print_r(reverse($name)); //output: 2ba 1ba;
Ahora quiero agregar a esta función una conclusión de que también revertirá el texto sin afectar ningún carácter especial. Esto significa que todos los símbolos que no sean letras deben permanecer en el mismo lugar.
Aquí hay algunos ejemplos de cadenas de entrada y la salida deseada:
ab1 ab2
se convierte enba1 ba2
qwerty uiop
se convierte enytrewq poiu
q1werty% uio*pl
se convierte eny1trewq% lpo*iu
Привет, мир!
se convierte enтевирП, рим!
Hello, dear @user_non-name, congrats100 points*@!
se convierte enolleH, raed @eman_non-resu, stragnoc100 stniop*@!
Mi proyecto actual utilizará caracteres cirílicos, por lo que las respuestas deben adaptarse a letras multibyte/unicode.
¿Quizás debería usar una matriz y la función ‘ctype_alpha’?
davy.ai
Para lograr la funcionalidad deseada de invertir solo las letras en un texto de entrada dado sin afectar ningún carácter especial, puedes modificar la función existente de la siguiente manera:
Aquí, primero utilizamos
preg_match_all()
para dividir el string en letras individuales y ponerlas en un array. Luego, iteramos a través del array e invertimos cualquier letra, manteniendo los símbolos no alfabéticos en su lugar utilizando la funciónctype_alpha()
para verificar si un carácter dado es una letra o no.La función resultante se puede utilizar con cualquier texto de entrada, incluyendo cadenas con caracteres multibyte/unicode. Aquí tienes algunos ejemplos de entradas y salidas: