Pregunta

Quiero saber si hay alguna forma de dividir texto como este:

123456789 en 123-456-789

como para agregar " - " después de cada 3 caracteres?

Solo quería saber, ya que sé lo contrario, pero cómo hacerlo está sobre mi cabeza. ;)

y también si el texto es

ABCDEFGHI OR A1B2C3D4E or any other format 
without any space between the characters !

languge : PHP only
¿Fue útil?

Solución

<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
prints
result: 123-456-789

ver http://php.net/wordwrap

Otros consejos

No soy un gran admirador de las expresiones regulares para la extracción simple de cadenas (especialmente las extracciones de longitud fija), prefiero estas para cosas un poco más complejas. Casi todos los idiomas tienen una función de subcadena, por lo que, suponiendo que su entrada ya haya sido validada, un simple (pseudocódigo ya que no ha especificado un idioma):

s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)

Si lo desea cada tres caracteres para una cadena de longitud variable (con un tamaño impar al final):

t = ""
sep = ""
while s != "":
    if s.len <= 3:
        t = t + sep + s
        s = ""
    else:
        t = t + sep + substring (s,0,3)
        s = substring (s,3)
    sep = "-"
s = t

Para cualquier idioma:

  • Cree una variable de cadena vacía llamada " result "
  • Cree una variable de contador de enteros, "i", que se incrementa hasta la longitud de la cadena original (la que tiene el número)
  • Agregue cada carácter de la cadena original a " result "
  • Si i módulo 3 (generalmente% o mod) es cero, agregue un guión al resultado ""

En aras de la integridad, aquí hay una solución de Python:

>>> a = "123456789"
>>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
'123-456-789'

Dado que actualizó su pregunta para especificar una solución PHP, esto debería funcionar:

substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)

Consulte substr para obtener más información sobre esta función. Esto funcionará no solo para los dígitos, sino también para los caracteres alfabéticos.

Otra versión más de Python:

>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789

Creo que esto se puede hacer de manera sensata en una expresión regular con anticipación:

s/(.{3})(?=.)/$1-/g

Como mencionó PHP en un comentario:

preg_replace ("/(.{3})(?=.)/", "$1-", $string);

edit : después de que VolkerK mostró wordwrap , encontré chunk-split en la documentación:

$new_string = chunk_split ($string, 3, '-');

Esto tiene la ventaja de que también funciona cuando hay espacios en la cadena (wordwrap preferiría separarse en los espacios).

En Perl:

#!/usr/bin/perl

use strict;
use warnings;

my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;

print "$1-$2-$3"

Puede hacerlo con (entre otros medios) una coincidencia de expresión regular y reemplazar. La sintaxis exacta depende de la herramienta o el lenguaje de programación que esté utilizando. Por ejemplo, una forma de hacerlo en Perl sería

$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;

La línea 2 reemplaza cada 3 dígitos por los mismos 3 dígitos y un guión. Con chop () eliminamos el guión final.

Hay otra pregunta aquí. ¿Qué hacer cuando la cadena no contiene un múltiplo de 3 dígitos? Si se permitieran tales cadenas, entonces el fragmento anterior necesitaría modificación.

Además, dependiendo de los detalles del caso, es posible que se salga con el reemplazo simple de la subcadena o el corte de cadenas.

Un ejemplo más de Perl. Esto no elimina los grupos finales de menos de tres, y deja solo los grupos iniciales de menos de tres dígitos. Se basa (bastante descaradamente) en los "números de dinero". ejemplo en Learning Perl (página 212 de la quinta edición):

#!/usr/bin/env perl
use strict;
use warnings;

print "Gimme' a number: ";
chomp(my $number = <STDIN>);

1 while ($number =~ s/([0-9]{3})([0-9]+)/$1-$2/);

print "Now it's $number\n";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top