es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 en ba1 ba2
  • qwerty uiop se convierte en ytrewq poiu
  • q1werty% uio*pl se convierte en y1trewq% lpo*iu
  • Привет, мир! se convierte en тевирП, рим!
  • Hello, dear @user_non-name, congrats100 points*@! se convierte en olleH, 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’?

Tags:  , , ,

Answer

  1. Avatar for 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:

    function reverse($string)
    {
        $letters = [];
        $result = '';
    
        // dividir el string en letras individuales y ponerlas en un array
        preg_match_all('/./u', $string, $letters);
    
        // iterar a través del array e invertir cualquier letra, manteniendo los símbolos no alfabéticos en su lugar
        for ($i = 0; $i < count($letters[0]); $i++) {
            if (ctype_alpha($letters[0][$i])) {
                $result .= array_pop($letters[0]);
            } else {
                $result .= $letters[0][$i];
            }
        }
    
        return $result;
    }
    

    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ón ctype_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:

    Entrada: ab1 ab2
    Salida: ba1 ba2
    
    Entrada: qwerty uiop
    Salida: ytrewq poiu
    
    Entrada: q1werty% uio*pl
    Salida: y1trewq% lpo*iu
    
    Entrada: Привет, мир!
    Salida: тевирП, рим!
    
    Entrada: Hello, dear @user_non-name, congrats100 points*@!
    Salida: olleH, raed @eman_non-resu, stragnoc100 stniop*@!
    

Comments are closed.