2010-08-10 6 views
12
$string = 'Some string'; 
$pos = 5; 

...??... 

$begging // == 'Some s'; 
$end // == 'tring'; 

¿Cuál es la mejor manera de separar la cuerda en dos por posición dada?cuerda separada en dos por posición dada

+0

¿Cómo es la posición? ¿Calculó su valor basado en '$ string'? –

+0

Hay respuestas alternativas dadas. ¿Qué quisiste decir con "la mejor manera"? ¿lo más rápido? ¿menos código? – humanityANDpeace

Respuesta

24

Puede utilizar substr para obtener los dos sub-cadenas:

$str1 = substr($str, 0, $pos); 
$str2 = substr($str, $pos); 

Si se omite el tercer parámetro longitud , substr toma el resto de la cadena.

Pero para conseguir el resultado que realmente se necesita para agregar uno a $pos:

$string = 'Some string'; 
$pos = 5; 
$begin = substr($str, 0, $pos+1); 
$end = substr($str, $pos+1); 
+4

¡Ten cuidado cuando trabajes con cadenas multibyte! –

+1

Al usar '$ pos + 1' estás omitiendo un caracter.Dado un $ pos de 5, terminará con '" Some "' and '" tring "' – meagar

+0

@meagar: ¡Vaya, gracias por el comentario! – Gumbo

1

¿Cuál es la mejor manera de separar cadena en dos por posición dada?

si entiendo que correctamente, puede hacer:

$str = 'hello world'; 
$pos = 5; 

$separated_str = substr($str, $pos); 
echo $separated_str; 

Resultado:

world 

Esto depende de la estructura de la cadena, ya que hay otras maneras también para dividir la cuerda.

+0

esto no se aplica a la pregunta OP "cadena separada en dos por posición dada" también dijiste, "Esto depende de la estructura de tu cuerda ya que hay otras formas de dividir la cadena", ¿puedes volver a editar? – AndreL

3

¿Qué tal substr()?

$string = 'Some string'; 
$pos = 5; 

$beginning = substr($string, 0, $pos); 
$end = substr($string, $pos); 
9

solución de expresiones regulares (si está en ella):

... 
$string = 'Some string xxx xxx'; 
$pos = 5; 

list($beg, $end) = preg_split('/(?<=.{'.$pos.'})/', $string, 2); 

echo "$beg - $end"; 

Saludos

RBO

+8

Un uso tan inapropiado de expresiones regulares ... – meagar

+4

Ohh, veo, si respondo a una pregunta de PHP y ** no ** repito la solución obvia (que se dio idénticamente cuatro veces hasta ahora) y trato de mostrar un alternativa, los compañeros me rechazarán. ¡Bonito! –

+0

convencer a la gente de la ventaja de su solución sobre la forma 'substr'. –

0

Wordwrap funciona mejor en mi opinión.

$text = "The quick brown fox jumped over the lazy dog."; 
$newtext = wordwrap($text, 20, "<br />\n"); 
echo $newtext; 

El resultado del ejemplo sería:

The quick brown fox<br /> 
jumped over the lazy<br /> 
dog. 

Otro ejemplo:

$text = "A very long woooooooooooord."; 
$newtext = wordwrap($text, 8, "\n", true); 

echo "$newtext\n"; 

El resultado del ejemplo sería:

A very 
long 
wooooooo 
ooooord. 
1

que estaba buscando un ayuno forma de dividir una strin g en una posición dada.

¿Por qué una posición determinada? Por lo general, lo que necesita es dividir en contra de un personaje (creo que ha buscado por la posición porque la función de explotar sería dividir la cadena en demasiadas piezas):

Mi solución fue finalmente:

$string = "hello world my dear"; 
list ($first, $remaining) = split (' ', $string, 2); //limit to 2 pieces 
echo $first; //"hello"; 
echo $remaining; //"world my dear"; 

en cuenta que yo dejó caer el uso de "posición" (estaba usando "substr" para obtenerlo).

Dado que su necesidad de "posición" no era realmente necesaria, mi solución es la más rápida entre todas las anteriores y no tiene problemas de bytes múltiples. También creo que es mucho más fácil de leer.

Desafortunadamente, esa función está en desuso en el último PHP, puede usarla si tiene PHP antiguo o puede usar preg_split. No estaba muy feliz de eso porque la única forma de lograr la misma funcionalidad es abusar de Regex. En caso de que no se puede utilizar split la alternativa más rápida es:

$string = "hello world my dear"; 
list ($first, $remaining) = preg_split('/\s+/', $string, 2); 

cual es mucho más rápido que @rubber respuesta y no utiliza posición en absoluto.

Referencia: Split documentation

0
<?php 
$string = 'Some string'; 
$pos = 6; 
$number_of_pieces = 2; 
list($beginning, $end) = split_into_pieces($string, $pos, $number_of_pieces); 
// $beginning === 'Some s'; $end === 'tring' 

function split_into_pieces($string, $length, $limit = 0) { 
    --$length; 
    return preg_split("/(?<=^..{{$length}}|(?!^)\\G.{{$length}})/", $text, $limit); 
} 
  • $string es la cadena para dividir
  • $length es el tamaño de cada pieza en Unicode puntos de código (o caracteres ASCII si no se usa la opción UTF-8 , vea abajo). Cualquier valor inferior a 1 devolverá toda la cadena de entrada como una sola pieza
  • $limit es el número máximo de piezas o 0 para ilimitado. La pieza final contendrá el resto de la cadena, y podría ser más largo o más corto que $length

la expresión regular que está haciendo la magia está utilizando un vistazo detrás positivo (?<= ... ). Busca ^, que es el inicio de la cadena, | o si no está al comienzo de la cadena (?!^), busca \G, que es la posición de la coincidencia anterior. . es cualquier carácter, {n} se repite n veces, donde n es {$length}. Al usar \G, agrega un carácter adicional por alguna razón, por lo que existe la línea --$length; y por qué la primera coincidencia tiene un . adicional para buscar un punto de código adicional, que generalmente no está permitido en los retrospectivos. Creo que las aserciones de ancho cero ^ y \G están anclando el patrón, permitiendo diferentes longitudes en el look-behind.

El extra { y } alrededor de $length son necesarios para detener las llaves regex que se interpretan como una variable escapada de PHP. /su son las opciones de expresiones regulares. La opción /s dice allow . para que coincida con los caracteres de nueva línea. La opción /u dice que coincida con los puntos de código Unicode codificados como UTF-8 (elimine u si está analizando cadenas que no son compatibles con UTF-8).

Cuestiones relacionadas