[PHP] Como solucionar este problemilla?(facil?)

SikorZ

Vereis, estoy con el proyecto de fin de curso y a mi me llegan unos datos que debo importar en una base de datos, mi problema es el siguiente, el cual en teoria debería ser facil de solucionar, pero no consigo hacerlo.

A mi me llegan los nombres de los alumnos de un centro con una variable, por ejemplo $alumno, en ella van su nombre y apellidos con el siguiente formato: "Apellido1 Apellido2, Nombre" y necesito dividir estos 3 en una variable independiente cada uno, por ejemplo: $apellido1 + $apellido2 y $nombre, dividir el nombre de los apellidos ha sido facil, he encontrado la funcion explode el cual divide despues de ", " (coma y espacio) y coje lo primero como apellidos y el segundo como nombre.

Se supone que deberia ser facil dividir $apellidos en $apellido1 y $apellido2, y de hecho lo es, el problema lo encuentro cuando hay una persona que se llama, por ejemplo asi:
"Fernández de la Vega Sanz, María Teresa"

Como coño puedo hacer que sepa que Fernández de la Vega es un apellido y Sanz otro?
La idea que me ha dado mi profesora es que coja los "de", "del" y "de la" y le quite los espacios para que por ejemplo un explode los divida en 2 variables ya que solo existe un espacio y no el del apellido compuesto y que luego los vuelva a separar, tras mucho intentarlo no soy capaz de conseguirlo, alguna ayuda?:)

suaveSHOW

Es muy sencillo con la función explode.

$alumno='Apellido1 Apellido2, Nombre';
$nom=explode(',',$alumno);

Y ya solo tendrías que asignar que es el nombre y apellido.

$nombre=$nom[1];
$apellidos=$nom[0];

Lo que puedes hacer es que los apellidos vayan separados de algo mas, por ejemplo, un "-" o un "." y usar otra vez la función explode.

LR

tal y como lo tiene ahora...

<?php
$nombre = "Apellido1 Apellido2, Nombre";
$nom = explode(",",$nombre);
$apellido = explode(" ",$nom[0]);
$nom = $nom[1];
echo $nom."<br>";
echo $apellido[0]."<br>";
echo $apellido[1]."<br>";

?>

ahi lo tienes

Resultado:

Nombre
Apellido1
Apellido2

SikorZ

#2 A ver, es que creo que no me he explicado bien, a mi me llega esto tal que asi, por ejemplo:

$Nombrecompleto ---> Fernández de la Vega Sanz, María Teresa

y de ahi tengo que sacar el nombre en $nombre, el apellido uno en $apellido1 y el apellido dos en $apellido 2, como ves "Fernández de la Vega Sanz" son los apellidos, tengo que hacer que distinga entre Fernández de la Vega (apellido 1) y Sanz (apellido 2) y los meta cada uno en una variable ($apellido1 y $apellido2)
EDIT: #3 eso lo se hacer yo, lo que no se es que sepa que "de" "del" y "de la" va dentro de un mismo apellido, para que al coger $apellido1 salga "Fernández de la Vega" y al coger $apellido2 salga "Sanz", que los divida aunque tengan "de", "de la" y "del", ahi veo la complicacion

suaveSHOW

#3, pero a ver, el dice que y si el apellido es compuesto, p.e. De la peña, como diferencia mediante espacio el primero del segundo, si hace con el espacio le saldra con el br
de
la
peña

SikorZ

#5 Exacto, pero no puedo dividir los apellidos, llega tal que asi: "Fernández de la Vega Sanz, María Teresa" ya que los estoy importando desde un CSV desde una base de datos de la junta de andalucia, por eso no se como dividirlos bien, una solucion es la que puse antes de juntarlos cuando haya un de de la o del y luego separarlos =/ pero esk no se..

aNuBiS

Yo le veo mala solución, si el apellido no esta delimitado por nada y es de longitud variable es...Un problema XD

SikorZ

La solucion que me han dado es quitar los espacios del "de, del y de la" y luego separarlo en 2 variables y despues volver a poner el espacio.

Por ejemplo:

Del alba saez, pepe

Delalba Saez <--- sacar las dos separadas por el espacio variables y luego volver a ponerlo bien

Del alba Saez

LR

para hacer eso, mejor ponle un . entre un apellido y otro y cortas por el punto. Te ahorras quitar espacios y volver a ponerlos.

tarzanete

Es que si al crear el formulario de entrada de datos pones apellidos, luego lo almacenas de una tacada los apellidos en la bd, y si los separas, son dos entradas distintas.
Filtrar apellidos, cuando no sabes como están formados (partículas distintas, espacios, combinaciones de 2 o 3 palabras cada parte) es casi imposible. O terminas haciendo un cacao xD apellido1= apellido[numpalabras de apellido /2] xD

SikorZ

#9 y #10 que ya lo seeee... pero ahi esta la cosa, el nombre me viene completo si o si y es mi funcion dividirlo en $nombre $apellido1 y $apellido2 por ejemplo, se que dividir los apellidos al 100% es imposible pero la profesora me ha dicho que al menos haga lo de que el "de" "del" y "de la" de los apellidos los coja con el suyo tal y como puse en los ejemplos anteriores, no busqueis otras cosas, simplemente hay que hacer eso, a mi me parece k debe ser sencillo pero no se como hacerlo =/

EDIT: Repito de nuevo, a mi me viene si o si por ejemplo: "Fernández de la Vega Sanz, María Teresa", de ahi dividir el nombre de los apellidos es facil, hago un explode por la coma+espacio y me cojera todo lo que va despues de la coma+espacio como $nombre, pero en los apellidos tengo que dividirlo en $apellido1 y $apellido2 teniendo en cuenta unicamente los "de", "de la" y "del".

POR EJEMPLO:
"Fernández de la Vega Sanz, María Teresa"

María Teresa <--- $nombre (ya lo he hecho)

Fernández de la Vega <--- $apellido1
Sanz <--- $apellido2.

La profesora me ha dicho que puedo juntar los de, del y de la, por ejemplo
FernándezdelaVega Sanz
y luego hacer el explode al espacio para que me los divida y una vez dividido volver a separar los de, de la y del para que quede bien:
Fernández de la Vega <--- $apellido1
Sanz <--- $apellido2

aNuBiS

#11 Vale, pero tampoco es una solución valida para todos los datos porque puede haber apellidos simples, compuestos de dos palabras, de tres, de media... No puedes llegar y decir, le quito 2 espacios porque puede que solo tenga uno, y si por ejemplo le quitas todos los espacios vuelves a juntar los apellidos.

Como ya hemos dicho, mala solución, dile a tu profesora que deje de fumar.

cabron

PHP tiene expresiones regulares no? Pues haces un replace de ' de ' por 'de', lo haces también con ' de la ' por 'dela' y ' del ' por 'del' y ya está. Como solución real es una puta mierda por que te cambia los apellidos, pero si es para un ejercicio y tu profesora te lo acepta, pues palante.

Estós son los patrones que tienes que buscar:

de-del-de la, al principio y solo al principio de la cadena (caso de que sea el primer apellido)

de-de-de la, en cualquier parte de la cadena, siempre que esté precedido y seguido por un espacio (caso de que sea el segundo apellido)

SikorZ

#13 Eso es, lo hice, primero un explode para dividir apellidos del nombre y luego replaces para quitar los espacios y tal pero que va, mira que es facil, que ya he hecho muchos replaces en el otro script pero no tengo cojones de hacerlo funcionar como deberia... te importaria ponerme el ejemplo para entenderlo y asi lo hago?

Gracias:)

cabron

No he hecho nunca expresiones regulares en php, te lo pongo en javascript que es muy fácil de ver (guarda esto como archivo html y ábrelo en cualqueir navegador). Las expresiones regulares funcionan igual en todos los lenguajes, a lo mejor cambián los caracteres usados para representar las cosas, pero no te debería costar mucho cambiar esto si hiciese falta:

http://pastebin.com/NTnE2Kcj

Resumido:
Lo que va entre / / es el patrón a buscar.
\s significa espació, así que de\sla\s significa: buscar 'de la '
La g del final significa "buscar en cualquier lugar", así te lo sustituye tanto para el primer apellido como para el segundo.

"de la vega de la villa", se queda como "delavega delavilla", y ya podrías usar explode otra vez para separar los dos apellidos.

Haces lo mismo tres veces seguidas, una para el 'de', otra para el 'del', y otra para el 'de la', y ya está.

SikorZ

#15 Ya pero es que eso de java no tiene nada que ver con las sentencias en PHP, es que entenderlo lo entiendo al 100%, por eso os pongo una solucion de como hacerlo, lo que no soy capaz de es de hacerlo funcionar y creo que lo estaba haciendo bien...

explode para dividir las cosas y str replace para reemplazarlas y tal pero esk no me sale, me sale

Valor Valor Valor

y por mucho que lo intento no lo consigo, soy un negado para las cadenas estas ¬.¬":..

cabron

A ver que creo que no me has entendido, lo que te he puesto tiene su equivalente en php:

http://www.php.net/manual/en/function.preg-replace.php
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

Como mucho te cambia el nombre de las funciones y que símbolo se usa para indicar cada cosa, por eso te he explicado lo que hace cada símbolo, para que busques el equivalente (que igual hasta es el mismo)

SikorZ

Mirad, hasta aqui he llegado

Codigo PHP

Y el resultado donde los 3 primeros nombres originalmente son:

del Ballesteros Márquez, Juanjo
de la Barranca Moreno, Alejandro
Dopino de Falcón, Pepe

A mi me muestra:

de l Ballesteros Márquez, Juanjo
de la Barranca Moreno, Alejandro
Dopino de Falcón, Pepe

El fallo esta en que al reemplazar el "del" y el "dela" lo haga como lo haga "dela" siempre contiene "del" asi que hara el cambio saliendo ese espacio de ningun sitio, la única solucion le veo es poder reemplazarlo estrictamente, en vez de con STR_REPLACE que busca esa cadena y la cambia, otra funcion que coja estrictamente la parte que necesito y no lo que contiene... alguna idea? creo que no se puede=/..

cabron

Mírate lo que te he puesto en el post anterior... tienes que usar preg_replace no str_replace, y tienes que usarlo como el ejemplo que te he puesto, que aunque sea otro lenguaje, se hace igual.

Usuarios habituales

  • cabron
  • SikorZ
  • aNuBiS
  • tarzanete
  • LR
  • suaveSHOW