Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Expresiones regulares PCRE

Estas en el tema de Expresiones regulares PCRE en el foro de PHP en Foros del Web. Hace unos días puse en el foro una clase para paginación. Dicha clase funciona, pero después de hacer más pruebas, he encontrado un error en ...
  #1 (permalink)  
Antiguo 14/01/2014, 03:04
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Expresiones regulares PCRE

Hace unos días puse en el foro una clase para paginación. Dicha clase funciona, pero después de hacer más pruebas, he encontrado un error en el método que crea el nuevo enlace.

Dicho error consiste en que en el siguiente método, sustituye solamente un dígito, y lo que quiero lograr es que sustituya cualquier cantidad de dígitos, no uno, ni dos, ya que el paginador está pensado para que sea, en teoría, ilimitado.

Código PHP:
Ver original
  1. /*
  2.      * busca y sustituye un patron dentro de una URL para
  3.      * eliminar ese patron y sustituirlo para crear una nueva URL
  4.      * evitando repetir el patron en la URL
  5.      *
  6.      * por ejemplo evitar::          ?page=1&page=2&page=3
  7.      */
  8.     public  function    createURL($url, $id, $page)
  9.     {
  10.         //si el identificador no se encuentra en la url
  11.         if(substr_count($url, $id)  ==0)
  12.         {
  13.             //agrega al final de la url el identificador y el valor que le corresponde
  14.             $url  =   $url."&".$id."=".$page;
  15.         }
  16.        
  17.         //sino busca y reemplaza el identificador en la url por su nuevo valor
  18.         else
  19.       {
  20.             $url  =   preg_replace("/(".$id."=[[:digit:]])/i", $id."=".$page, $url);
  21.         }
  22.        
  23.         return  $url;
  24.     }

Después de leer sobre expresiones regulares, no encuentro nada que me sirva para alcanzar mi propósito con esta expresión regular.

¿Alguien puede orientarme?
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 14/01/2014, 04:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Expresiones regulares PCRE

Creo que te complicas la vida.... no seria mejor siempre construir a partir de una url "limpia" ($url="http://tudominio", protocolo y dominio sin parametros)...

Además fijate que estas haciendo

$url."&".$id."=".$page; <--- linea 14

Si $url es igual a "http://tudominio" y $id no es igual a "tudominio" va a llegar a esa linea y la url final será

"http://tudominio&page=1"

is $id es page y $page es 1.... lo que dará un un error....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 14/01/2014, 04:49
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Expresiones regulares PCRE

Entiendo lo que dices quimfv, pero la idea es poder tratar la URL y mantener el orden de variables GET alterando solo el valor de las paginaciones.

El supuesto que me comentas no podría suceder porque las paginaciones tienen que ser sobre algo, un objeto identificable, no sobre la web general. No le veo sentido a poder paginar la web en general.

Por ejemplo:

http://tudominio.com?page=1

Para mi no tiene sentido, puesto que http://tudominio.com es la web en si misma, no hay varias webs para paginar.

Pero sí tiene sentido para mi

http://tudominio.com?pantalones=cort..._cortos_page=3

Ahí estoy paginando claramente pantalones cortos dentro de la categoría pantalones.

Entonces, por eso intento hacerlo así, mantener la coherencia de la URL, paginando el elemento que le indico y no otro y además mantener el orden de paginación, para así resolver dos problemas:

Impedir duplicados de paginación y además dar soporte a múltiples paginaciones a varios objetos contenidos en un mismo objeto.

De esta manera una URL de paginación múltiple mantendría su coherencia de la siguiente manera:

URL 1) http://tudominio.com?pantalones=cort...1&color=marron

URL 2) http://tudominio.com?pantalones=cort...s=2&color=gris

Como ves, varios objetos se deben poder paginar dentro de un objeto principal (en este caso pantalones), y para poder mantener la coherencia, los objetos deben poder mantener siempre el mismo orden en la URL.

Por lo que nunca, según entiendo yo, podría suceder que una paginación se inicie sin iniciar antes el objeto que se pretende paginar. Y todos los objetos para iniciarlos en la URL se hacen con ? si es el primero o con & si es un objeto dentro de otro.

Mi inquietud es que no he encontrado herramientas en las expresiones regulares para definir un número de dígitos ilimitado para poder tener paginaciones tanto de un dígito como de 5 o 20.000, aunque en la práctica PHP tenga limitaciones en cuanto a capacidad de procesamiento numérico, así como la capacidad del tamaño de una URL en un navegador.

Si lo ves de otra manera dimelo, siempre es bueno revisar lo que uno ha hecho con la opinión de otros y no me cierro a la posibilidad de cambiarlo y aprender de otros :D

Muchas gracias por tu ayuda! xD
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 14/01/2014, 05:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Expresiones regulares PCRE

Entonces extiendo el razonamiento a la url limpia y a una lista de campos y valores...

http://tudominio.com/archiviX.php?pa...1&color=marron

createURL($url, $arrayParametros, $id, $page)

$url="http://tudominio.com/archiviX.php"
$arrayParametros=(pantalones=>cortos,bolsillos_lat erales=>1,color=>marron);
$id="page"
$page=3
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 14/01/2014, 05:36
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Expresiones regulares PCRE

Pero el problema no lo tengo a la hora de pasar la URL correcta, el verdadero problema lo tengo a la hora de encontrar y sustituir el número de paginación del identificador.

Un identificador en mi razonamiento es el nombre del objeto_page.

Dicho identificador de paginación para un objeto tiene un valor numérico.

Ese valor numérico con expresiones regulares, tal y como tengo escrito el código, puedo buscarlo y sustituirlo si es un número de un solo dígito.

La cuestión es dar soporte a un valor numérico de uno o varios dígitos.

Ahí es donde tengo el verdadero problema, por lo demás funcionaría correctamente el paginador y además cumpliría con mis necesidades de paginación.

Pero no encuentro las herramientas o razonamiento de regular expression adecuado para poder buscar y encontrar valores números de uno o varios dígitos.

Tu razonamiento consiste en desarmar la URL o en su defecto componerla, a raíz de un array, y no veo que eso sea necesario :S y sería resolver la cuestión de pasar la URL pero de otra manera, quedando aún el problema de buscar y encontrar en la URL el valor numérico de la paginación que el método esté tratando en cada ejecución.

Simplemente con que alguien me de alguna referencia de dónde tengo que buscar o qué tengo que leer para dicho soporte me conformo.

Gracias quimfv!! :D
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 14/01/2014, 07:24
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Expresiones regulares PCRE

Pude solucionarlo. Después de leer, releer y volver a leer, no solo en la web oficial, sino en otros sitios, pude solucionar el problema con la RegExp.

El método quedó así

Código PHP:
Ver original
  1. /*
  2.      * busca y sustituye un patron dentro de una URL para
  3.      * eliminar ese patron y sustituirlo para crear una nueva URL
  4.      * evitando repetir el patron en la URL
  5.      *
  6.      * por ejemplo evitar::          ?page=1&page=2&page=3
  7.      */
  8.     public  function    createURL($url, $id, $page)
  9.     {
  10.         //si el identificador no se encuentra en la url
  11.         if(substr_count($url, $id)  ==0)
  12.         {
  13.             //agrega al final de la url el identificador y el valor que le corresponde
  14.             $url  =   $url."&".$id."=".$page;
  15.         }
  16.        
  17.         //sino busca y reemplaza el identificador en la url por su nuevo valor
  18.         else
  19.       {
  20.             $url  =   preg_replace("/(".$id."=[[:digit:]]*)/i", $id."=".$page, $url);
  21.         }
  22.        
  23.         return  $url;
  24.     }

La modificación consistía en incorporar un asterisco * al final de digit.

Gracias por tu tiempo quimfv! :D y siento las molestias.
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: expresiones, regulares
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 12:14.