Foros del Web » Programando para Internet » PHP »

expresiones regulares preg_match...

Estas en el tema de expresiones regulares preg_match... en el foro de PHP en Foros del Web. Hola a todos, tengo una duda y la verdad es que no se muy bien como formular la pregunta, aquí un intento. Quiero realizar una ...
  #1 (permalink)  
Antiguo 31/08/2005, 02:28
Avatar de illman  
Fecha de Ingreso: mayo-2001
Mensajes: 115
Antigüedad: 22 años, 11 meses
Puntos: 0
expresiones regulares preg_match...

Hola a todos, tengo una duda y la verdad es que no se muy bien como formular la pregunta, aquí un intento.

Quiero realizar una función que busque y reemplace una serie de expresiones regulares en una cadena de texto dada, hasta aquí todo ok, esta parte sería algo parecido a los editores de textarea, en los que p.e. [b] se convierte en </b>. Pero para complicarlo me gustaría saber si hay alguna forma de saber la cadena que queda en medio de dos expresiones regulares dadas, un ejemplo más claro: Si en la cadena de texto coloco [OPCION25/], hay alguna manera de recuperar el 25, mi lógica me dice que busque [OPCION [0-9] /], pero no se que función de php (ni si existe, aunque me la juego a que si) me puede dar este resultado. Todo esto para después sustituir esta expresión por el valor devuelto por otra función que analizaría en función del resultado devuelto.

En conclusión ...

Quiero que de una cadena :

" hola mundo [imagen25/] que tal?"

se convierta en...

" hola mundo <img src="loquesea.jpg"> que tal?"

Muchas gracias de antemano

Última edición por illman; 31/08/2005 a las 02:35
  #2 (permalink)  
Antiguo 02/09/2005, 07:51
Avatar de illman  
Fecha de Ingreso: mayo-2001
Mensajes: 115
Antigüedad: 22 años, 11 meses
Puntos: 0
Vaya nadie?

Quizás no me explicado con claridad, lo que quiero es que a través de un formulario recoger el siguiente texto, por ejemplo:

Hola mundo, me llamo illman, y este es mi avatar [imagen25].

Y que a través de la localización de expresiones regulares se convierta en:

Hola mundo, me llamo <b>illman</b>, y este es mi avatar <img src="img25.jpg">.

Lo de colocar las negritas, sustituir, ... no problemo baby. Lo que quería es desmontar, [imagen25] en [imagen, 25, ], recuperando de esta manera el 25, que lo utilizaré como ID para localizar la imagen que debe sustituir a la cadena. Algo parecido a lo que hacemos cuando convertimos los enlaces http://.. pero utilizando el valor.

Una ayudita please, quizás es algo la mar de evidente, que tengo delante de la nariz, pero no lo pillo.

Gracias de nuevo
  #3 (permalink)  
Antiguo 02/09/2005, 12:50
 
Fecha de Ingreso: julio-2005
Mensajes: 13
Antigüedad: 18 años, 9 meses
Puntos: 0
Lo que deseas sería algo así:

Código PHP:
<?php

$texto 
"Hola mundo, me llamo illman, y este es mi avatar <imagen25>";

print 
preg_replace('/<imagen(\d+)>/','<img src="\1.jpg" border="0" />'$texto);
?>
espero te ayude..

Saludos.
  #4 (permalink)  
Antiguo 05/09/2005, 03:15
Avatar de illman  
Fecha de Ingreso: mayo-2001
Mensajes: 115
Antigüedad: 22 años, 11 meses
Puntos: 0
Casi, casi...

Realmente lo que quiero hacer colocar el valor \1 en una variable para utilizarlo como una ID y recuperar el nombre de archivo para luego realizar la sustitución.

Lo tengo hecho buscando las cadenas, y contando los carácteres,... lo que ralentiza mucho el script... sabes si hay alguna manera de hacerlo?
  #5 (permalink)  
Antiguo 06/09/2005, 12:07
 
Fecha de Ingreso: julio-2005
Mensajes: 13
Antigüedad: 18 años, 9 meses
Puntos: 0
Supongo entonces que debería de funcionarte la función
preg_match_all:

Código PHP:
preg_match_all"/<imagen([0-9]+)>/"$texto$coincidencias); 
donde el arreglo $coincidencias tendrías lo necesario para lo que deseas (o al menos eso creo yo). Un ejemplo:

Código PHP:
<?php
$texto 
"imagen 1= <imagen1> -- imagen 2= <imagen2> -- imagen 10= <imagen10>";

preg_match_all"/<imagen([0-9]+)>/"$texto$coincidencias);

for (
$i 0$limite count($coincidencias[1]); $i $limite$i++) {
  print 
$coincidencias[0][$i] . " - " $coincidencias[1][$i] . " <br/>";
}

?>
el resultado de lo anterior sería:

Código HTML:
<imagen1> - 1 <br/>
<imagen2> - 2 <br/>
<imagen10> - 10 <br/> 
luego podrías utilizar, por ejemplo, la función strtr para remplazar <imagen1> por lo que quieras...

espero haberte ayudado...

Saludos.
  #6 (permalink)  
Antiguo 06/09/2005, 12:23
 
Fecha de Ingreso: septiembre-2005
Ubicación: Bs as, capital
Mensajes: 77
Antigüedad: 18 años, 7 meses
Puntos: 0
Para hacerlo mas simple, hay una funcion en PHP que se encarga de buscar un texto en string o variable, y reemplazarlo por otro, la funcion es la siguiente:
str_replce("texto a buscar", "texto por el que es reemplazado", $variable);
  #7 (permalink)  
Antiguo 07/09/2005, 00:38
Avatar de illman  
Fecha de Ingreso: mayo-2001
Mensajes: 115
Antigüedad: 22 años, 11 meses
Puntos: 0
Muchas gracias habeis resuelto la duda que tenía.

Espero poder ayudaros yo en el futuro
  #8 (permalink)  
Antiguo 24/09/2005, 15:10
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 20 años, 5 meses
Puntos: 4
Espero que todavia no sea muy tarde para aportar algo útil

se trata de una descripcion o un manual o ejemplo de como utilizar las expresiones regulares, saludos
Código PHP:
/*Sintaxis básica de una expresión regular:

Los símbolos especiales “^” y “$” se usan para matchear el principio y el final de un string respectivamente.
Por ejemplo:
“^el” Matchea strings que empiezan con “el”
“colorin colorado$” Matchea strings que terminan en “colorin colorado”
“^abc$” String que empieza y termina en abc, es decir solo “abc” matchea
“abc” Un string que contiene “abc” por ejemplo “abc” ,”gfabc”, “algoabcfgeh”, etc...

Los símbolos “*” , “+” y “?” denotan la cantidad de veces que un caracter o una secuencia de caracteres
puede ocurrir. Y denotan 0 o más, una o más y cero o una ocurrencias respectivamente.
Por ejemplo:
“ab*” Matchea strings que contienen una “a” seguida de cero o mas “b”
Ej: “a”, “ab”, “cabbbb”, etc
“ab+” Matchea strings que contienen una “a” seguida de una o mas “b”
“ab?” Matchea strings que contienen una “a” seguida o no de una “b” pero no mas de 1.
“a?b+$” Matchea “a” seguida de una o mas “b” terminando el string.

Para indicar rangos de ocurrencias distintas pueden especificarse la cantidad máxima y mínima de
ocurrencias usando llaves de la forma {min,max}
“ab{2}” Una “a” seguida de exactamente 2 “b”
“ab{2,}” Una “a” seguida de 2 o mas “b”
“ab{3,5}” Una “a” seguida de 3 a 5 “b” (“abbb”, “abbbb”, ”abbbbb”)

Es obligatorio especificar el primer número del rango pero no el segundo. De esta forma
+ equivale a {1,}. * equivale a {0,} y ? equivale a {0,1}

Para cuantificar una secuencia de caracteres basta con ponerla entre paréntesis.
“a(bc)*” Matchea una “a” seguida de cero o mas ocurrencias de “bc” ej: “abcbcbc”

El símbolo “|” funciona como operador “or”
“hola|Hola” Matchea strings que contienen “hola” u “Hola”
“(b|cd)ef” Strings que contienen “bef” o “cdef”
“(a|b)*c” Secuencias de “a” o “b” y que termina en “c”

El carácter “.” matchea a cualquier otro caracter.
“a.[0-9]” Matchea “a” seguido de cualquier caracter y un dígito.
“^.{3}$” Cualquier string de exactamente 3 caracteres.

Los corchetes se usan para indicar que caracteres son validos en una posición única del string.
“[ab]” Matchea strings que contienen “a” o “b”
“[a-d]” Matchea strings que contienen “a”, “b” , “c” o “d”
“^[a-zA-Z]” Strings que comienzan con una letra.
“[0-9]%” Un dígito seguido de un signo %

También puede usarse una lista de caracteres que no se desean agregando el símbolo “^” dentro de los
corchetes, no confundir con “^” afuera de los corchetes que matchea el principio de línea.
“[^abg]” Strings que NO contienen “a” , “b” o “g”
“[^0-9]” Strings que no contienen dígitos

Los caracteres “^.[$()|*+?{\” deben escaparse si forman parte de lo que se quiere buscar con una barra
invertida adelante. Esto no es válido dentro de los corchetes donde todos los caracteres no tienen significado
especial.
Ejemplos:
Validar una suma monetaria en formato: “10000.00”, “10,000.00” .,“10000” o “10,000” es decir con o sin
centavos y con o sin una coma separando tres dígitos.
^[1-9][0-9]*$
Esto valida cualquier número que no empieza con cero, lo malo es que “0” no pasa el test. Entonces:
^(0|[1-9][0-9]*)$
Un cero o cualquier número que no empieza con cero. Aceptemos también un posible signo menos delante.
^(0|-?[1-9][0-9]*)$
O sea cero o cualquier número con un posible signo “-“ delante.
En realidad podemos admitir que un número empiece con cero para una cantidad monetaria y supongamos
que el signo “-“ no tiene sentido, agreguemos la posibilidad de decimales:
^[0-9]+(\.[0-9]+)?$
Si viene un “.” debe esta seguido de un dígito, 10 es válido pero “10.” no
Especifiquemos uno o dos dígitos decimales:
^[0-9]+(\.[0-9]{1,2})?$
Ahora tenemos que agregar las comas para separar de a miles.
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
O sea un conjunto de 1 a 3 dígitos seguido de uno más conjuntos de “,” seguido de tres dígitos. Ahora
hagamos que la coma sea opcional.
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(\.[0-9]{1,2})?$
Y de esta forma podemos validar números con los 4 formatos validos en una sola expresión.
*/ 
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 19:16.