Foros del Web » Programando para Internet » PHP »

trabajando con cadenas

Estas en el tema de trabajando con cadenas en el foro de PHP en Foros del Web. Estoy programando un sistema de menus para mi página. La configuración de los menus y los submenus se guarda en una cadena con el siguiente ...
  #1 (permalink)  
Antiguo 28/01/2005, 10:25
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 13 años
Puntos: 0
trabajando con cadenas

Estoy programando un sistema de menus para mi página. La configuración de los menus y los submenus se guarda en una cadena con el siguiente formato:

Código PHP:

$config
=Páginas Web[EstandaresLa W3C[Proyectos], ETC
Donde entre cada corchete([SUBMENU]) indica un submenu, y donde las comas (,) indican varios submenus del mismo nivel.

He estado buscando alguna función de PHP para que me capture las cadenas entre los corchetes y que me los meta en un array.

Mi busqueda no ha dado resultados... alguien sabe de la existencia de alguna función de php que haga esto? o algo parecido? o tendre que programar una yo?

MUCHAS GRACIAS A TODOS

Última edición por thunder-ion; 28/01/2005 a las 10:30
  #2 (permalink)  
Antiguo 28/01/2005, 10:51
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
sin duda debes usar expresiones regulares:
http://www.php.net/preg_match_all
leete la documentacion de eso y proba con uno de estos patrones a ver si andan...
Código:
/\[(.*)\]/
Código:
/\[([^\[\]])\]/
estan a vuelo asi que anda a seber que puede pasar.

Y si estas con las pilas puestas leete esto
http://ar2.php.net/manual/en/referen...ern.syntax.php

Saludos
  #3 (permalink)  
Antiguo 29/01/2005, 10:34
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 13 años
Puntos: 0
Si que funciona con el primer código
Código PHP:
preg_match_all("(\[(.*)\])",'menu[submenu]',$salida);
echo 
$salida[0][0]; 
Muchisimas gracias.

El problema ahora es coger el tranquillo a las expresiones regulares, que de momento no tengo mucha practica... el primer código he descifrado algo entre líneas... pero me lo podrías explicar con palabras??

MUCHAS GRACIAS!!!!
  #4 (permalink)  
Antiguo 31/01/2005, 10:00
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
De verdad asustan la ER cuando las ves por primera vez, pero con paciencia y mucha mas paciencia se puede.....

A ver...
Código:
\[ 
indica que la exp. tiene un corchete, pero como veras debe ser "escapeado" con una barra invertida para que no se confunda y lo tome con inicio de una clase de caracteres (mira en el manual que son las clases de caracteres)
\]
lo mismo que arriba, para que no se confunda con un cierre de clase de caracteres
()
lo que esta entre parentesis indica un subpatron, entonces tu array $salida va a tener en su clave 0 ($salida[0]) todo lo que encuentre la ER, y ademas en sus otras claves lo que "cace" la subexpresion regular que esta dentro de los "()" 

.
el punto es algo asi como "cualquier cosa" excepto un caracter de nueva linea (\n).

*
el asterisco es un cuantificador  de 0 o mas caracteres...

entonces
.*
quiere decir que busque cualquier caracter que se repita 0 o mas veces.
espero que esta explicacion no te haya confunfido mas. jejeje

saludos!
  #5 (permalink)  
Antiguo 31/01/2005, 10:01
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
Prueba con este patron que me parece mejor, pero que olvide un pequeño detalle:
Código:
/\[([^\[\]]*)\]/
  #6 (permalink)  
Antiguo 31/01/2005, 10:41
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Una expresion asi al aire no sirve mucho...

En primer lugar tendrias que hacer un stack para manejar los infinitos niveles de submenus. (array_push() y array_pop() ). Entonces cada vez que encuentras un [ o ] vas metiendo o sacando.
  #7 (permalink)  
Antiguo 31/01/2005, 13:46
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 13 años
Puntos: 0
Anoto Appletalk, las dos funciones,que desde luego me servirán cuando la aplicación madure.

En cuento a la explicación, me ha venido de perlas, no me ha liado, me ha aclarado mis dudas un poquito más. He probado el pratrón nuevo y funciona correctamente.

Lo que he estado observando es la posición de los parentesis...
/\[([^\[\]]*)\]/
He visto que si cambio la posición de lo que esta entre esos parentesis y lo pongo al final...
/\[\]/([^\[\]]*)
PHP me devuelve un error... Supongo que será porque no es una expresión válida... pero porque?

Saludoss
  #8 (permalink)  
Antiguo 01/02/2005, 10:20
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
Appletalk
No se porque criticas la ER, explicame porque no sirve de mucho?
obviamente va a haber que reprocesar la cadena para escavar en los submenues, pero mi intencion no es solucionar de una el problema, sino ayudar a quien lo necesita. Despues cada cual puede opinar y sugerir, pero tampoco entres a dar indirectas que menosprecian mi trabajo y buena intencion.
Y si hago cosas al vuelo es porque no tengo donde probarlas en ese momento, no porque se me de la gana.

thunder-ion
esas / que se encuentran al inicio y al final en la ER original son "delimitadores" que se usan para obviamente delimitar donde inicia y donde termina.
esto tiene otras aplicaciones, por ejemplo se pueden agregar al final letras de opcion que modifican el comportamiento.
EJ:
Código:
/palabra/i
donde "i" dice que no se distingan entre mayus/minus. Fijata en
Table 1. Internal option letters << del manual


el error que te surge puede deberse a eso entonces, falta del delimitador del final.
Descifraste lo que estaba entre (); es lo que te comentaba antes... una clase de caracter; solo que en este caso como dentro de los [] hay un ^ dice que NO a lo que le sigue....
es decir cualquier caracter que no sea \[ y \] (en realidad son corchetes que estan escapeados con barras invertidas)

Saluditos!
  #9 (permalink)  
Antiguo 01/02/2005, 15:14
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
No quise y de hecho no menosprecie tu trabajo y buena voluntad.

Perdon si te ofendi.

Saludos
  #10 (permalink)  
Antiguo 01/02/2005, 15:29
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 13 años
Puntos: 0


Ajam, todo comprendido... ahora solo falta practicar, y practicar para llegar a dominar con soltura las ER... Tu ayuda anterior me ayudará mucho a arrancar...

Muchisimas gracias por todo, no se que hubiera hecho sin tu ayuda!!!!!

Saludos
  #11 (permalink)  
Antiguo 03/02/2005, 09:47
Avatar de thunder-ion  
Fecha de Ingreso: diciembre-2004
Mensajes: 106
Antigüedad: 13 años
Puntos: 0
Bueno pues he empezado a practicar con las expresiones regulares.Quiero que me envie la función eregi verdadero cuando SOLO hay caracteres de la A a la Z y numeros, pero tambíen me coje caracteres como este #, este otro _ etc...

La expresión es la siguiente:
([a-z]*)([0-9]*)
¿Que podría hacer para que solo se mostraran letras y numeros?
  #12 (permalink)  
Antiguo 03/02/2005, 10:37
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 15 años, 4 meses
Puntos: 8
Hola!
Solo una sugerencia.... en ves de usar eregi() utiliza preg_match() con el /i al final, que (segun dice en el manual) es bastante mas rapido.
Si usas el * estas diciendo que la clase de caracter puede o no estar, en ves de eso usa +, que significa "esta un vez o mas veces"..... es lo mismo que {,0}
Leete la parte de cuantificadores del manual!
Otra cosita..... puedes unir las dos clases [a-z0-9]

Saludos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:38.