Eliminar el carácter delimitador final de una cadena delimitada

7 minutos de lectura

avatar de usuario
IM-JM

¿Cuál es la forma más rápida de eliminar el último carácter de una cadena?

tengo una cadena como

a,b,c,d,e,

Me gustaría eliminar el último ‘,’ y recuperar la cadena restante:

OUTPUT: a,b,c,d,e

¿Cuál es la forma más rápida de hacer esto?

  • si esta cadena se concatena mediante un bucle, puede usar “implosionar”, se concatenará sin la última coma

    – Tufan Barış Yıldırım

    8 de abril de 2011 a las 9:24

  • @Tufan Barış Yıldırım: la concatenación de cadenas no está en bucle

    – IM-JM

    8 de abril de 2011 a las 9:34

  • No se preocupe por “más rápido” sin haber realizado primero algún tipo de medición que sea importante. En lugar de preocuparse por lo más rápido, piense en qué camino es más claro.

    –Andy Lester

    18/09/2013 a las 16:55

  • Esto no debe marcarse como un duplicado ya que la otra pregunta indica que sabe cuál es el último carácter (‘un punto’).

    – FruitBreak

    5 de agosto de 2014 a las 16:04

  • @FruitBreak No, está marcado correctamente, como puede ver por qué respuesta aceptó IM-JM. es de nuevo trim(). Entonces quiere decir “¿Cómo eliminar los últimos caracteres específicos de la cadena?” y no “el último”. Todas las demás respuestas son “incorrectas” por eso. La única marca duplicada incorrecta tiene esta pregunta.

    – mgutt

    2 de abril de 2015 a las 9:53


Contrariamente a la pregunta formulada, rtrim() removerá cualquier número de caracteres, enumerados en el segundo argumento, desde el final de la cadena. En caso de que espere una sola coma, el siguiente código funcionaría:

$newarraynama = rtrim($arraynama, ",");

Pero en mi caso tenía 2 caracteres, una coma y un espacio, así que tuve que cambiar a

$newarraynama = rtrim($arraynama, " ,");

y ahora eliminaría todas las comas y espacios del final de la cadena, devolviendo a, b, c, d, e ya sea de a, b, c, d, e,, a, b, c, d, e,,,, a, b, c, d, e, o a, b, c, d, e , ,, , ,

Pero en caso de que pueda haber varias comas, pero debe eliminar solo el ultimodespués rtrim() no debe usarse en absoluto; vea otras respuestas para la solución que responde directamente a la pregunta.

Sin embargo, rtrim() podría ser una buena opción si no sabe si el carácter adicional podría estar presente o no. A diferencia de substrsoluciones basadas en que volverá a, b, c, d, e de a, b, c, d, e

  • ¿Cómo? ¿Puede proporcionar una especie de ejemplo

    – IM-JM

    8 de abril de 2011 a las 9:17

  • @IM Solo reemplaza $string por sus datos, y haga eco de todo: echo rtrim("a,b,c,d,e,", ",");

    luego

    8 de abril de 2011 a las 9:18


  • ¡realmente genial!, al menos para mí… estoy demasiado buscando esto… y lo encontré aquí… gracias +1

    – Mohamed Sufian

    24/01/2014 a las 21:45

  • Tenga en cuenta que esto no responde a la pregunta publicada en el título.

    – DaveWalley

    11/04/2014 a las 16:39

  • Tenga en cuenta que esta es una forma peligrosa de eliminar la coma adicional al final de una cadena CSV (un problema bastante común al concatenar valores en un bucle). Esto de hecho se convertiría A;B;C;D; a A;B;C;Dpero también transformará A;B;;; a A;B. A menudo, uno quiere conservar los delimitadores entre valores vacíos, porque un analizador CSV podría necesitar determinar el número de campos de la propia cadena.

    – Etuardu

    13 de enero de 2015 a las 19:51

avatar de usuario
Nicola Peluchetti

Puedes usar substr:

echo substr('a,b,c,d,e,', 0, -1);
# => 'a,b,c,d,e'

En caso de que el último carácter pueda ser de varios bytes, entonces mb_substr() debe usarse en su lugar.

  • Este es el buen camino. Quería eliminar la última coma de una cadena como: “a,b,c,d,” y esta es la solución correcta porque si usa rtrim() eliminará las dos últimas comas.

    – serfer2

    15 de octubre de 2013 a las 8:24


  • Esto funcionó muy bien para mí, un método muy bueno, no tenía idea de que podría usar un número negativo allí y comenzar desde 0. Estoy de acuerdo con el comentario anterior, esto es mucho mejor que rtrim, tuve un problema similar donde no quiero eliminar los últimos caracteres pero una palabra de una cadena SQL al FINAL de la cadena solo como “Y”, así que usé esto con substr(“sqlstatement”, 0, -7); para eliminar el último AND en la secuencia de cláusulas WHERE AND que estaba escribiendo. Trabajado como un encanto :).

    -Joseph Astrahan

    8 de noviembre de 2013 a las 7:49


  • Esta debería ser la respuesta aceptada: elimina el último carácter (no solo ‘,’) como se preguntó originalmente.

    – DaveWalley

    11/04/2014 a las 16:41

  • trim y rtrim no elimine el último carácter de una cadena. Aunque a veces eso es todo lo que hacen, a menudo eliminarán muchos caracteres de la cadena. p.ej rtrim('Assess','s') te da ‘Asse’, no ‘Asses’. Es por eso que esta respuesta es mejor que la respuesta aceptada.

    -Buttle Butkus

    20 de marzo de 2015 a las 4:52

  • El código es defectuoso, use esto en su lugar: $substring = substr($string, 0, strlen($string)-1);

    – Unterbelichtet

    16 de enero de 2021 a las 16:35

avatar de usuario
bart

una alternativa a substr es la siguiente, como una función:

substr_replace($string, "", -1)

¿Es el más rápido? No lo sé, pero estoy dispuesto a apostar que estas alternativas son tan rápidas que simplemente no importa.

Tenga en cuenta que esta función no es segura para varios bytes y producirá el resultado no deseado si el último carácter es de varios bytes.

  • el problema con “tan rápido, no importa” es que puede estar en un bucle. Imagínese, ese código se ejecuta 50 veces por cada letra en un texto largo. De repente, cada pequeña actuación cuenta.

    – Hasta

    7 de junio de 2017 a las 14:11

  • @Hasta que no estoy seguro de si funciona así, no verifiqué la fuente, pero supongo que substr_replace($str, $replacement, $start[, $length]) El último par de parámetros limitan las letras que son “intervenidas quirúrgicamente”. Es decir substrcantando solo analizará/reemplazará los caracteres de la subcadena (en este caso vaciados). Una vez hecho esto, el resto de la cadena inalterada se concatena.

    – CPH Python

    9 de agosto de 2018 a las 10:03

avatar de usuario
Bas van Ommen

Puedes usar

substr(string $string, int $start, int[optional] $length=null);

Ver substr en la documentación de PHP. Devuelve parte de una cadena.

avatar de usuario
jxwd

Use la expresión regular al final del ancla de cadena “$”

$string = preg_replace("/,$/", '', $string);

  • Sorprendentemente, me gusta este por ser meticulosamente correcto: eliminará solo una coma, solo siendo el último carácter, y solo si está presente

    – Tu sentido común

    20 de junio a las 15:15


avatar de usuario
Tu sentido común

“Los lo más rápido mejor código es el código que no existe”.

Hablando de casos extremos, hay un problema bastante común con la coma final que aparece después del ciclo, como

$str="";
foreach ($array as $value) {
    $str .= "$value,";
}

lo cual, supongo, también podría ser el caso en la pregunta inicial. En este caso, el método más rápido definitivamente sería no agregar la coma final en absoluto:

$str="";
foreach ($array as $value) {
    $str .= $str ? "," : "";
    $str .= $value;
}

aquí estamos comprobando si $str ya tiene algún valor, y si es así, agregando una coma antes de el elemento siguiente, por lo que no tiene comas adicionales en el resultado.

  • Sorprendentemente, me gusta este por ser meticulosamente correcto: eliminará solo una coma, solo siendo el último carácter, y solo si está presente

    – Tu sentido común

    20 de junio a las 15:15


avatar de usuario
Montasser-Mossallem

Además, puede usar otra función de PHP llamada mb_substr. Esta función toma 4 parámetros para buscar y devolver la parte de destino como una cadena

<?php 
  $string = "a,b,c,d,e,";

  // To delete the last char in the previous URL 
   echo mb_substr( $string, 0, -1 ); 
?>

En esto artículohay más detalles al respecto

  • Sin embargo, una coma no es multibyte. Así que esta es una versión más cara de una respuesta anterior.

    – mickmackusa

    1 hora antes

¿Ha sido útil esta solución?