Foros del Web » Programando para Internet » PHP »

Extractar unicamente #s

Estas en el tema de Extractar unicamente #s en el foro de PHP en Foros del Web. Por favor, hace ya rato que no los molestaba: Si tengo la cadena: Código PHP: <? $info  =  "Hola a to2!, las 5 de la tarde y nada... Ya más de 9 manuales buscados y no hallo como decirle a PHP que: LEA UNA CADENA Y ME SAQUE DE ELLA UNICAMENTE LOS NUMEROS" ; // Es decir, que a esta cadena yo le pueda decir: $info  =  funcionquedeconozco  ...

  #1 (permalink)  
Antiguo 16/08/2003, 17:48
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Exclamación Extractar unicamente #s

Por favor, hace ya rato que no los molestaba:

Si tengo la cadena:

Código PHP:
<?
$info 
"Hola a to2!, las 5 de la tarde y nada... Ya más de 9 manuales buscados y no hallo como decirle a PHP que:

LEA UNA CADENA Y ME SAQUE DE ELLA UNICAMENTE LOS NUMEROS"
;

// Es decir, que a esta cadena yo le pueda decir:

$info funcionquedeconozco ($info);

// Asi que ahora imprimo la cadena y me da:

echo $info;

?>
RESULTADO: 259

Luego yo podre decirle a PHP:

Código PHP:
<?
$lasinfo 
$info1 $info2 $info3 $info4 $info5 $info6;
echo 
$lasinfo;
?>
Y... Como seria al revez?, es decir, que de una cadena me ELIMINE UNICAMENTE to2 los numeros?

Muchas gracias.
  #2 (permalink)  
Antiguo 16/08/2003, 18:10
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 16 años, 4 meses
Puntos: 9
Depende, usas mysql para mostrar los resultados?
  #3 (permalink)  
Antiguo 16/08/2003, 18:18
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Muchas Gracias lado2mx, no....

La otra vez le pedi a Manoloweb que me ayudara, y nos quedamos en el semaforo verde, si logramos la coneccion, pero no logro que este TORPEdo crerara la base de datos...

Asi que no he podido estudiar MySQL.

No amigo, la cosa es sacar de $cadena los numeros.

Muchas gracias por su tiempo.

Aqui en Colombia son las 18:00, halla en España?
  #4 (permalink)  
Antiguo 16/08/2003, 20:59
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 16 años, 4 meses
Puntos: 9
Estuve buscando, pero creo que la información esta aca, creo: http://www.php.net/manual/es/ref.strings.php

Aun no estoy seguro, si hay algo te aviso, mientras te dejo el link

saludos
  #5 (permalink)  
Antiguo 18/08/2003, 12:04
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Que tal RAZACALA!!

Dame unos minutos... creo que la solucion es muy simple...

__________________
Manoloweb
  #6 (permalink)  
Antiguo 18/08/2003, 12:15
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Pues aqui esta...

Código PHP:
<?
function funcionquedeconozco($cadena) {
    
$numeros="";
    
$largo=strlen($cadena);
    for (
$i=0;$i<$largo;$i++){
        if (
is_numeric($cadena{$i})) {
            
$numeros.=$cadena{$i};
        }
    }
    return 
$numeros;
}

$info "Hola a to2!, las 5 de la tarde y nada... Ya más de 9 manuales buscados y no hallo como decirle a PHP que: LEA UNA CADENA Y ME SAQUE DE ELLA UNICAMENTE LOS NUMEROS";

$info funcionquedeconozco($info);

echo 
$info;

?>
__________________
Manoloweb
  #7 (permalink)  
Antiguo 18/08/2003, 13:23
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Muchas gracias Manolo, sinceramente entendi 0 de la funcion que creaste... No estoy tan versado en el PHP.

Te molesto + por que puedes leer en el POST cuales son mis intenciones, que se pueden resumir asi: (y como veras no sucede, pues el resultado debiera ser: 210 Pesos).

<?
$a = "Los alumos A tienen [$10] Pesos";
$b = "Los alumos B tienen [$20] Pesos";
$c = "Los alumos C tienen [$30] Pesos";
$d = "Los alumos D tienen [$40] Pesos";
$e = "Los alumos E tienen [$50] Pesos";
$f = "Los alumos F tienen [$60] Pesos";

$info = "$a + $b + $c + $d + $e + $f";

// $info = explode("+", $info); ** Con esto $info seria "cadenitas" ¿Sera util?

function funcionquedeconozco($cadena) {
$numeros="";
$largo=strlen($cadena);
for ($i=0;$i<$largo;$i++){
if (is_numeric($cadena{$i})) {
$numeros.=$cadena{$i};
}
}
return $numeros;
}

$info = funcionquedeconozco($info);
echo "$info Pesos";
?>
  #8 (permalink)  
Antiguo 18/08/2003, 16:52
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Bueno, esto debería solucionar tu necesidad:

Código PHP:
<?
$a 
"Los alumos A tienen [$10] Pesos";
$b "Los alumos B tienen [$20] Pesos";
$c "Los alumos C tienen [$30] Pesos";
$d "Los alumos D tienen [$40] Pesos";
$e "Los alumos E tienen [$50] Pesos";
$f "Los alumos F tienen [$60] Pesos";

$info "$a + $b + $c + $d + $e + $f";

// $info = explode("+", $info); ** Con esto $info seria "cadenitas" ¿Sera util?

function funcionquedeconozco($cadena) {
    
$numeros="\$tal=";
    
$largo=strlen($cadena);
    for (
$i=0;$i<$largo;$i++){
        if (
is_numeric($cadena{$i})) {
            
$numeros.=$cadena{$i};
        }
        if (
$cadena{$i}=="+") {
            
$numeros.=" + ";
        }

    }
    
$numeros.=";";
    eval(
$numeros);
    return 
$tal;
}

$info funcionquedeconozco($info);
echo 
"$info Pesos";
?>
__________________
Manoloweb
  #9 (permalink)  
Antiguo 18/08/2003, 17:01
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Aunque yo le mejoraría la parte donde haces la cadena, pues así podras agregar mas cadenas nuevas sin tener que modificar nada mas...

Código PHP:
$alumnos["a"] = "Los alumos A tienen [$10] Pesos";
$alumnos["b"] = "Los alumos B tienen [$20] Pesos";
$alumnos["c"] = "Los alumos C tienen [$30] Pesos";
$alumnos["d"] = "Los alumos D tienen [$40] Pesos";
$alumnos["e"] = "Los alumos E tienen [$50] Pesos";
$alumnos["f"] = "Los alumos F tienen [$60] Pesos";

$info implode(" + ",$alumnos);

function 
funcionquedeconozco($cadena) {
    
$numeros="\$tal=";
    
$largo=strlen($cadena);
    for (
$i=0;$i<$largo;$i++){
        if (
is_numeric($cadena{$i})) {
            
$numeros.=$cadena{$i};
        }
        if (
$cadena{$i}=="+") {
            
$numeros.=" + ";
        }

    }
    
$numeros.=";";
    eval(
$numeros);
    return 
$tal;
}

$info funcionquedeconozco($info);
echo 
"$info Pesos"
__________________
Manoloweb
  #10 (permalink)  
Antiguo 18/08/2003, 20:36
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Manolo, muchas gracias, tu programa salio PERFECTO!!

Muchas gracias de veras por tomarse la molestia, tiene mucho menos código que el mio : ).

****************

No se de tu tiempo, pero si te queda un poco, "revisa" lo siguiente por favor:

****************

Si todas las variables a,b,c,d,e,f [que logicamente son suministradas por un "formulario.htm"], no contienen numeros, el programa da error:

ACLARACION: Por alguna razon puede ser que:

<SELECT NAME="Alumno a">
<option value="0">Los alumnos del grupo A</option>
<option value="No tienen cuadernos">No tienen cuadernos</option>
<option value="Tienen poquitos cuadernos">Tienen poquitos cuadernos</option>
<option value="Tienen 30 cuadernos">Tienen 30 cuadernos</option></SELECT>

Es cierto que con solo colocar el VALUE=0 se arregla el problema, pero creo que seria más apropiado MEJORAR tu programa, verdad?

$a = "Los alumos A tienen [ ] Cuadernos";
$b = "Los alumos B tienen [ ] Cuadernos";
$c = "Los alumos C tienen [ ] Cuadernos";
$d = "Los alumos D tienen [ ] Cuadernos";
$e = "Los alumos E tienen [ ] Cuadernos";
$f = "Los alumos F tienen [30] Cuadernos";

RESULTADO:
30 Cuadernos.

$a = "Los alumos A tienen [ ] Cuadernos";
$b = "Los alumos B tienen [ ] Cuadernos";
$c = "Los alumos C tienen [ ] Cuadernos";
$d = "Los alumos D tienen [ ] Cuadernos";
$e = "Los alumos E tienen [ ] Cuadernos";
$f = "Los alumos F tienen [ ] Cuadernos";

RESULTADO:
Parse error: parse error, unexpected ';' in C:\222\felicidad\1\index.php(23) : eval()'d code on line 1
Pesos

// DISCULPA MI MOLESTADERA, PERO ME ESFUERZO POR SER LO + CLARO QUE PUEDO.
  #11 (permalink)  
Antiguo 18/08/2003, 20:50
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Je je... bueno, no sabía que existia esa posibilidad...

vamos a ver...

Tal vez sea solo un parche... pero creo que funciona...
Código PHP:
<?
$alumnos
["a"] = "Los alumos A tienen  Pesos";
$alumnos["b"] = "Los alumos B tienen [$20] Pesos";
$alumnos["c"] = "Los alumos C tienen [$30] Pesos";
$alumnos["d"] = "Los alumos D tienen [$40] Pesos";
$alumnos["e"] = "Los alumos E tienen [$50] Pesos";
$alumnos["f"] = "Los alumos F tienen [$60] Pesos";

$info implode(" + ",$alumnos);

function 
funcionquedeconozco($cadena) {
    
$numeros="\$tal=";
    
$largo=strlen($cadena);
    
$tiene=0;
    for (
$i=0;$i<$largo;$i++){
        if (
is_numeric($cadena{$i})) {
            
$numeros.=$cadena{$i};
            
$tiene=1;
        }
        if (
$cadena{$i}=="+" && $tiene==1) {
            
$numeros.=" + ";
            
$tiene=0;
        }

    }
    
$numeros.=";";
    eval(
$numeros);
    return 
$tal;
}

$info funcionquedeconozco($info);
echo 
"$info Pesos";
?>
__________________
Manoloweb
  #12 (permalink)  
Antiguo 18/08/2003, 23:39
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Intringulis

No se que es un parche, pero no funciono.

Te repito las "situacion":

Dado el caso de que NINGUNA de las variables enviada por "form.html" tenga numero, si no solo texto como por jemplo:

********
* $a = "Los alumos A tienen poquitos Cuadernos";
* $b = "Los alumos B tienen libros y Cuadernos";
* $c = "Los alumos C tienen medallas y Cuadernos";
* $d = "Los alumos D tienen algunos Cuadernos";
* $e = "Los alumos E tienen amigos y Cuadernos";
* $f = "Los alumos F detestan los Cuadernos";
********

Tu programa da error.

Tu me enviaste esto:

$alumnos["a"] = "Los alumos A tienen Pesos";
$alumnos["b"] = "Los alumos B tienen [$20] Pesos";
$alumnos["c"] = "Los alumos C tienen [$30] Pesos";
$alumnos["d"] = "Los alumos D tienen [$40] Pesos";
$alumnos["e"] = "Los alumos E tienen [$50] Pesos";
$alumnos["f"] = "Los alumos F tienen [$60] Pesos";

PERO EL INTRINGULIS ES:

Cmo hacer para tu programa no de ERROR si las variables CARECEN EN ABSOLUTO de numeros?

PD: Tu ultimo script saca esto por pantalla:

*********
Parse error: parse error, unexpected ';' in C:\222\felicidad\1\index.php(27) : eval()'d code on line 1 Pesos
*********

No quiero presumir, pues es evidente que el script que realize tiene demasiado código en comparación al tuyo, pero el mio no da error si ningúna de las variables tiene numeros, pero como te dije: Aqui solo son 6 variables, pero si utilizamos 90?, 0 300?... o más?...

Ahi lo mejor seria utilizar tu programa, que esta a un paso de ser 100% buenaso!

GOURA!!

Última edición por RAZACALA; 18/08/2003 a las 23:45
  #13 (permalink)  
Antiguo 19/08/2003, 01:46
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Bueno, la solución que te puse es para evitar que si alguno o algunos de los datos NO tienen numeros, pero no para el caso donde ninguno lo tiene...

Para este ultimo caso, bastará con agregar algo así en la parte final...


Código PHP:
    if ($numeros!="\$tal=") {
    
$numeros.=";";
    eval(
$numeros);
    } else {
    
$tal="";
    }
    return 
$tal
O algo así...

__________________
Manoloweb
  #14 (permalink)  
Antiguo 19/08/2003, 02:37
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 meses
Puntos: 1
Hola a todos,

Este es un problema que me ha parecido muy interesante, y con el permiso de ustedes, me gustaría compartir la solución que se me ha ocurrido inicialmente.

El método de Manoloweb es sumamente interesante, y me asombra su ingenio al haber recurrido a una sentencia eval() para encontrar la solución.

Alternativamente, pienso que la solución podría obtenerse también mediante el uso de expresiones regulares, y esta es la primera implementación que se me ha ocurrido:


Código:
<?php

// Funcion que recupera los conjuntos de cifras de una cadena y
// devuelve la suma de estos valores

function funcionquedeconozco ($cadena)
{
    preg_match_all ('/\\b[\\d\\.]+\\b/', $cadena, $coincidencias);
    
    $num_coincidencias = count ($coincidencias[0]);

    for ($i = 0, $suma = 0; $i < $num_coincidencias; $i++)
        $suma += $coincidencias[0][$i];

    return $suma;
}


$alumnos1 = array (
    'a' => "Los alumos A tienen  Pesos",
    'b' => "Los alumos B tienen [$20] Pesos",
    'c' => "Los alumos C tienen [$30] Pesos",
    'd' => "Los alumos D tienen [$40] Pesos",
    'e' => "Los alumos E tienen [$50] Pesos",
    'f' => "Los alumos F tienen [$60] Pesos");


$alumnos2 = array (
    'a' => "Los alumos A tienen poquitos Cuadernos",
    'b' => "Los alumos B tienen libros y Cuadernos",
    'c' => "Los alumos C tienen medallas y Cuadernos",
    'd' => "Los alumos D tienen algunos Cuadernos",
    'e' => "Los alumos E tienen amigos y Cuadernos",
    'f' => "Los alumos F detestan los Cuadernos");


$cadena1 = implode ('', $alumnos1);
$cadena2 = implode ('', $alumnos2);

$info1 = funcionquedeconozco ($cadena1);
$info2 = funcionquedeconozco ($cadena2);

echo "Ejemplo 1: $info1 Pesos\n";
echo "Ejemplo 2: $info2 Pesos\n";

?>

El algoritmo de la función es relativamente simple:

* Recuperar las coincidencias de una cadena dada con un patrón que representa conjuntos de cifras (0-9) o puntos (.) sucesivos. Los resultados se almacenan en la matriz $coincidencias.

* Inicializar un acumulador $suma en cero y recorrer la matriz $coincidencias, añadiendo el valor de cada elemento de la fila 0 al acumulador $suma. La fila cero de la matriz $coincidencias es en donde van a dar las secuencias de caracteres que coincidieron con la expresión regular completa.

* Devolver el valor de $suma.


Quizás sea útil al menos como material de referencia, ya que la solución de Manoloweb es estupenda.


Un cordial saludo
  #15 (permalink)  
Antiguo 19/08/2003, 11:02
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Que tal leonardop!

Muy interesante tu solución. de hecho mas simple que la mía

Aunque tal vez sería bueno meterse un poco más en el pattern para evitar que puedan incluirse cadenas como esta (125..0.5) en el array de los matches.

De hecho mi solución no contempla decimales.

Que interesante es ver como un mismo problema puede tener varias soluciones, y muy válidas todas.

Saludos!!

__________________
Manoloweb
  #16 (permalink)  
Antiguo 19/08/2003, 13:10
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Manolo, no tengo palabras; pues bien has podido apreciar que no hubo mucho interes en responder mi ?.

Solo puedo decir lo mismo de las ultimas 30 veces: GRACIAS.

Definitivamente para evitar entrar en la adulacion, contigo tendre que "utilizar una variable": $G = GRACIAS

Me ayudas y me animas con cada respuesta que haces; ojala algun día pueda hacer algo yo tambien.

**********************

1 // Que es un parche?

2 // Pues yo te hice caso:

AGREGUE:

***********
if ($numeros!="\$tal=") {
$numeros.=";";
eval($numeros);
} else {
$tal="";
}
return $tal;
**********

AL FINAL, Y NO DIO RESULTADO POSITIVO.

LO PUSE ASI:

<?
$alumnos["a"] = "Los alumos A tienen Pesos";
$alumnos["b"] = "Los alumos B tienen [$ ] Pesos";
$alumnos["c"] = "Los alumos C tienen [$ ] Pesos";
$alumnos["d"] = "Los alumos D tienen [$ ] Pesos";
$alumnos["e"] = "Los alumos E tienen [$ ] Pesos";
$alumnos["f"] = "Los alumos F tienen [$ ] Pesos";

$info = implode(" + ",$alumnos);

function funcionquedeconozco($cadena) {
$numeros="\$tal=";
$largo=strlen($cadena);
$tiene=0;
for ($i=0;$i<$largo;$i++){
if (is_numeric($cadena{$i})) {
$numeros.=$cadena{$i};
$tiene=1;
}
if ($cadena{$i}=="+" && $tiene==1) {
$numeros.=" + ";
$tiene=0;
}

}
$numeros.=";";
eval($numeros);
return $tal;
}

if ($numeros!="\$tal=") {
$numeros.=";";
eval($numeros);
} else {
$tal="";
}
return $tal;

$info = funcionquedeconozco($info);
echo "$info Pesos";
?>

********************
Y TAMBIEN ASI:

<?
$alumnos["a"] = "Los alumos A tienen Pesos";
$alumnos["b"] = "Los alumos B tienen [$ ] Pesos";
$alumnos["c"] = "Los alumos C tienen [$ ] Pesos";
$alumnos["d"] = "Los alumos D tienen [$ ] Pesos";
$alumnos["e"] = "Los alumos E tienen [$ ] Pesos";
$alumnos["f"] = "Los alumos F tienen [$ ] Pesos";

$info = implode(" + ",$alumnos);

function funcionquedeconozco($cadena) {
$numeros="\$tal=";
$largo=strlen($cadena);
$tiene=0;
for ($i=0;$i<$largo;$i++){
if (is_numeric($cadena{$i})) {
$numeros.=$cadena{$i};
$tiene=1;
}
if ($cadena{$i}=="+" && $tiene==1) {
$numeros.=" + ";
$tiene=0;
}

}
$numeros.=";";
eval($numeros);
return $tal;

if ($numeros!="\$tal=") {
$numeros.=";";
eval($numeros);
} else {
$tal="";
}
return $tal;
}

$info = funcionquedeconozco($info);
echo "$info Pesos";
?>

El primero no imprime ni siquiera la palabra Pesos.
El segundo imprime esto:

Parse error: parse error, unexpected ';' in C:\222\felicidad\1\index.php(27) : eval()'d code on line 1
Pesos

No quiero abusar de tu inmensa generosidad, pero creo que debo decirte si las cosas no me van bien con tu programa.

********************
Nuevamente: $G.

********************

LeonardoP, gracias por tu aporte, como veras no soy nada habil en programación de ningún tipo.

Los SCRIPTS SENCILLITOS, (de ejercicio), que ustedes hacen en minutos, a mi me lleva 4 horas hacerlo con el doble de lineas.

Logicamente no soy kpas de hacer algo que de veras valga la pena, como...

Un foro, o registro de usuarios...

Asi que como podras comprender, logre utilizar tu script, pero no entendi ni pio de lo que hace.

Es como el misterio de la Madre Naturaleza:

Sabemos que entra y que sale, pero no como se procesa...

Gracias a LoenardoP!!!
  #17 (permalink)  
Antiguo 19/08/2003, 14:35
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Que tal RAZACALA!

Ya sabes que mientras se pueda aqui estaremos viendo en que podemos ayudar...

Aqui te paso el codigo con la ultima modificacion PROBADA y funcionando (al menos en mi localjost)...

Código PHP:
<?
$alumnos
["a"] = "Los alumos A tienen  Pesos";
$alumnos["b"] = "Los alumos B tienen  Pesos";
$alumnos["c"] = "Los alumos C tienen  Pesos";
$alumnos["d"] = "Los alumos D tienen  Pesos";
$alumnos["e"] = "Los alumos E tienen  Pesos";
$alumnos["f"] = "Los alumos F tienen  Pesos";

$info implode(" + ",$alumnos);

function 
funcionquedeconozco($cadena) {
    
$numeros="\$tal=";
    
$largo=strlen($cadena);
    
$tiene=0;
    for (
$i=0;$i<$largo;$i++){
        if (
is_numeric($cadena{$i})) {
            
$numeros.=$cadena{$i};
            
$tiene=1;
        }
        if (
$cadena{$i}=="+" && $tiene==1) {
            
$numeros.=" + ";
            
$tiene=0;
        }

    }
    if (
$numeros!="\$tal=") {
        
$numeros.=";";
        eval(
$numeros);
        } else {
        
$tal="";
        }
    return 
$tal;}

$info funcionquedeconozco($info);
echo 
"$info Pesos";
?>
__________________
Manoloweb
  #18 (permalink)  
Antiguo 19/08/2003, 14:48
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Por otro lado, la solucion de leonardop esta basada en las expresiones regulares, que pudieran resumirse mas o menos así...

Una expresión regular es un "Patrón" compuesto de simbolos que representan partes de la estructura de una cadena que se quiere buscar...

Para ponerlo mas simple... imagina esto:

PATRON: "UNO O VARIOS NUMEROS O LETRAS" + "LA LETRA a" + "TRES NUMEROS"

cadena1: f12b3a123 (COINCIDE!)
cadena2: ra656 (COINCIDE!)
cadena3: 12a12e3 (NO COINCIDE!)
cadena4: aaaaaaaaaaa111 (COINCIDE!)

Viste? eso es en muy basicas palabras lo que hacen las expresiones regulares.

Por cierto, el "patrón" que puse es un patrón como cualquiera de nosotros lo diría, pero en términos de regexp, creo que sería algo así:

([a-zA-Z0-9]+)a([0-9]{3})


Te recomiendo leer la parte del manual sobre expresiones regulares (Regular Expressions), vale la pena.

Salud!!!
__________________
Manoloweb
  #19 (permalink)  
Antiguo 19/08/2003, 17:36
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Uy hermano, no si si te estoy llevando a los limites de tu pasiencia, pero:

Si dejo las variables como las has puesto:

$alumnos["a"] = "Los alumos A tienen Pesos";
$alumnos["b"] = "Los alumos B tienen Pesos";
$alumnos["c"] = "Los alumos C tienen Pesos";
$alumnos["d"] = "Los alumos D tienen Pesos";
$alumnos["e"] = "Los alumos E tienen Pesos";
$alumnos["f"] = "Los alumos F tienen Pesos";

TODO VA COMO UNA SEDA!!!!!!

Pero si a una variable le agrego un nmero, por ejemplo el 8:

$alumnos["a"] = "Los alumos A tienen 5 Pesos";
$alumnos["b"] = "Los alumos B tienen Pesos";
$alumnos["c"] = "Los alumos C tienen Pesos";
$alumnos["d"] = "Los alumos D tienen Pesos";
$alumnos["e"] = "Los alumos E tienen Pesos";
$alumnos["f"] = "Los alumos F tienen Pesos";

Entonces el resultado es:

Parse error: parse error, unexpected ';' in C:\222\felicidad\1\index.php(28) : eval()'d code on line 1
Pesos

Muchas $G,

Te repito:
Que es un parche?
Que es términos de regexp? Registro de expertos?

Pues IMAGINO que la Exp.Regular de Lonardo es:

preg_match_all ('/\\b[\\d\\.]+\\b/', $cadena, $coincidencias);

Pero esa linea no la entienden sino ustedes...

Más bien dime:

Si me quedo bien esta Exp.Reg:

([>9])

Con esto hago que omita los numeros inferiores a 9?

Ok. $G!!
  #20 (permalink)  
Antiguo 19/08/2003, 17:58
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Puede ser que lo parezca, pero NO!, NO Y NO ES ASI!!.

Yo no tengo ningun interes en hacerles perder su tiempo.

Solo que de vertas que a cada paso, resulta otro rollo...

Pues...

Se que es mucho pedir, pero por si acaso...

Como hacer que el script sume UNICAMENTE las cifras superiores a... 10 por ejemplo?.

Gracias.

DETALLO UN POCO EL PROPOSITO:

$a = "Carlos tiene 5 manzanas que valen 150 Pesos";
$b = "Luis tiene 8 bananos que cuestan 200 Pesos";

Resultado = 363 Pesos

Pero en realidad debiera mostrar 350 Pesos

Con la explicacion de Manolo invento algo similar a esto:

([>9]), pero más de eso no poder yo.

Si ya estan molestos, los apoyo, yo también estoy cansado con este rollo.

Cuanto + ustedes que son los que... Ya saben.

De todas formás, esto desde el comienzo ha ido en escala de progreso.
Cada vez el programa esta mejor.

Un saludazo!.
  #21 (permalink)  
Antiguo 19/08/2003, 19:06
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Solo cambiala así...

preg_match_all ('/\\b[\\d]{2,}[\\.]{0,1}[\\d]*\\b/', $cadena, $coincidencias);
__________________
Manoloweb
  #22 (permalink)  
Antiguo 19/08/2003, 20:10
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
De acuerdo

Pues... Manolo, creo que más no se puede pedir.

$G = $G*$G;

(Y menos en 2 días).

Uy.... Que berraquera Manolo, me tenes con una sonrisa de oreja a oreja!.

Conoces el grupo SINIESTRO TOTAL?.

Ellos dicen "Si fuese papa, Roma seria....

Y yo digo "Si este mundo fuera como FDW...

Creo que podemos declarar "POST CERRADO".

A menos que quieras despedirte diciendo (traduciendo), tu trozo agregado:

Código PHP:
AGREGADO:  ]{2,}[.]{0,1}[d]*
ORIGINALpreg_match_all ('/\\b[\\d   \\.]+                         \\b/'$cadena$coincidencias);
MANOLO:  preg_match_all ('/\\b[\\d   ]{2,}[\\.]{0,1}[\\d]*   \\b/'$cadena$coincidencias); 
Hasta un proximo chicharron!... : )

Última edición por RAZACALA; 19/08/2003 a las 20:20
  #23 (permalink)  
Antiguo 19/08/2003, 23:57
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Je je!!!

Bueno, creo que solo explicar la parte agregada no ayudaría... voy a tratar de traducir todas las partes...

'/\\b[\\d]{2,}[\\.]{0,1}[\\d]*\\b/'

Primera sección: '/
este caracter marca el inicio de un patrón

Segunda sección: \\b
Esto lo que hace es buscar una secuencia de caracteres NO COINCIDENTES en su tipo, por ejemplo un signo de $ y un numero

Tercera sección: [\\d]{2,}
Busca dos DIGITOS o más que estén juntos

Cuarta sección: [\\.]{0,1}
Busca cero o un puntos (.) por si hay decimales

Quinta sección: [\\d]*
Busca cero o más DIGITOS, que pudieran ser los decimales


Sexta sección: \\b
Igual que la segunda, por ejemplo el ultimo dígito y un espacio

Septima sección: /'
este caracter marca el final de un patrón

TRADUCIDO AL CASTELLANO:

Busca DOS o MAS digitos (numeros), seguidos o no por un punto y más dígitos, que antes y despues tengan otro caracter que no sea un número.


Saludos!


PD.- A un parche le llamo cuando en lugar de replantear un código por completo, le comienzas a pegar lineas para solucionar los problemas que te va dando en el camino, y esos "parches" a veces al final te dejan un larguisimo script para solucionar algo muy simple (como ha sido este caso)

NOTA: con "este caso" me refiero a la solución que puse yo originalmente, pues la solucion de leonardop ha sido la buena, y lo que le hemos agregado no han sido parches, sino simples mejoras para adaptarlo a tu necesidad....
__________________
Manoloweb

Última edición por Manoloweb; 20/08/2003 a las 00:02
  #24 (permalink)  
Antiguo 20/08/2003, 00:36
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 14 años, 5 meses
Puntos: 1
Hola de nuevo,

Me alegra que gracias a Manoloweb ya hayas encontrado la solución a tu último problema.

Por otra parte, ciertamente me parece importante que cosas como el significado de ciertas expresiones regulares resulte bien claro, en especial cuando, como ocurre en este caso, recae sobre una sola expresión regular gran parte de la funcionalidad de un algoritmo. Está muy bien que preguntes si no te ha quedado claro algo. Aquí todos estamos aprendiendo.

(Mientras escribía esta respuesta ya nuestro amigo aclaró brevemente el significado de la expresión, así que las siguientes líneas vendrían a repetir varias cosas, pero enviaré su contenido completo al menos por no alterar su sentido lógico.)

Las expresiones regulares son un tema extenso por sí solo, y de hecho existen libros enteros dedicados a su tratamiento. Uno de los principales problemas cuando se trata de implementar expresiones regulares es, por ejemplo, que no suele haber un consenso uniforme sobre el formato particular de las expresiones regulares. Distintas aplicaciones pueden contar con diferentes implementaciones para distintos tipos de expresiones regulares.

Por ejemplo, PHP mismo viene en la actualidad con soporte para dos tipos de estilos diferentes de expresiones regulares: estilo `Perl' y estilo `POSIX'. El estilo Perl, como es de suponerse, que busca ser tan fiel como sea posible al modo en que las expresiones regulares son tratadas en el lenguaje de programación Perl. Y el estilo POSIX, que opera bajo una seria de reglas definidas en un documento preparado por un comité que busca la estandarización de normas y reglas semánticas en ésta y otras áreas afines a los sistemas computacionales. Por encima, podría pensarse que no hay muchas diferencias entre uno u otro estilo, pero a medida que se entra en los detalles de la implementación (cosa que se aprecia inmediatamente en la medida en que se construyen expresiones regulares cada vez más sofisticadas), es inevitable toparse con diferencias críticas entre los dos estilos.

En fin, en PHP, las funciones de la `familia' preg_*() (preg_match(), preg_match_all(), preg_replace(), etc.) son parte del grupo de funciones de expresiones regulares compatibles con Perl. La documentación de PHP contiene extensiva información al respecto. Personalmente me parece especialmente valiosa para quien esté aprendiendo sobre expresiones regulares la página sobre Sintaxis de los patrones. Así mismo, y ya que hablamos de expresiones regulares "estilo Perl", cabría mencionar que la documentación de éste lenguaje al respecto es también muy informativa y extensa.

Entrando a referirnos particularmente sobre la expresión regular de nuestro ejemplo, podríamos describir su significado más o menos de esta forma:


Arrancamos de la siguiente expresión original

'/\\b[\\d\\.]+\\b/'

Antes que nada, cabe mencionar que esta expresión resulta siendo almacenada como algo de esta forma:

/\b[\d\.]+\b/

Pudo haberse escrito sin escapar algunos caracteres desde un principio, pero no se pierde nada al colocar las barras invertidas de forma explícita :) --escapar se le llama a la acción de preceder un caracter dado con una barra invertida (\), usualmente dentro de secuencias que contienen caracteres especiales.

Ahora bien, veamos el significado de cada segmento de la expresión regular:
  • Los caracteres delimitadores: //. Son aquellas barras que se encuentran al comienzo y al final de la expresión regular (claro que podrían ser otros caracteres diferentes a las barras). El uso de estos delimitadores nos permiten, por ejemplo, especificar modificadores especiales por fuera de la expresión regular misma. En este ejemplo no se usa ningún modificador, de modo que baste decir que los delimitadores solo son esos caracteres ubicados al principio y al final de la expresión.
  • Los indicadores de `límite' (boundaries): `\b'. Estos caracteres indican que, en el punto específico de la expresión en donde hayan sido colocados, debe existir un "límite" dentro de la secuencia de caracteres dada. Un límite puede ser el comienzo o final de la cadena (si el primer/último caracter es una letra tipo `palabra'), así como puede ser el paso de un caracter tipo `palabra' a un caracter `no-palabra'. Los caracteres `palabra' (\w) consisten en el rango de letras (mayúsculas y minúsculas), los números (0-9) y la raya inferior (_). Un caracter `no-palabra' (\W) es cualquier cosa diferente a \w.

    Por ejemplo, consideremos la frase "Todos los dias sale el sol.". Si colocamos un caracter (digamos, un signo de exclamación) en cada punto de esta frase que es considerada un límite, obtendríamos "!Todos! !los! !dias! !sale! !el! !sol!."

    En nuestra ejemplo particular, nuestra expresión regular funcionaría igualmente bien sin las secuencias \b, debido al efecto que tiene que las expresiones regulares sean por defecto "ambiciosas" (greedy), pero no es necesario, por ahora, entrar en detalles. Vamos aprendiendo paso por paso... :)
  • Los símbolos de ``clase de caracter'': []. Los corchetes cuadrados sirven para agrupar un conjunto (o `clase') de caracteres que funcionan como una especie de comodines en un punto determinado de la expresión regular. Básicamente, en nuestro ejemplo, estamos diciendo algo como "Cualquier cosa que sea o `\d' o `\.'".
  • La secuencia de dígito: \d. Esta secuencia produce coincidencias con cualquier cosa que sea un dígito (0-9).
  • El punto simplemente quiere decir eso, "un punto". Está escapado (tiene la barra invertida antes) porque de lo contrario el punto sería interpretado en la expresión regular de forma especial.
  • El más: +. Este caracter significa que aquello que esté ubicado antes de él (un caracter, o una secuencia de caracteres delimitada por paréntesis) debe presentarse una o más veces para generar una coincidencia con la expresión.

Así que, poniendo en palabras la expresión original, sería algo como:

"Busque coincidencias de secuencias de caracteres que, comenzando y terminando en límites (\b), consten de uno o más dígitos o puntos."

Por ejemplo, las siguientes cadenas generan coincidencias:

"Mi abuelo tiene 80 años" --> "80"
"Esta pista mide unos 1.62 kilómetros" --> "1.62"
"3" --> "3"
"abcde12345aeiou" --> "12345"
"." --> "."

Y las siguientes cadenas no generan coincidencias:

"Hoy está lloviendo"
"Yo no fui"


Respecto a las últimas modificaciones hechas por Manoloweb vemos básicamente dos elementos nuevos:
  • Especificación de número de ocurrencias: {}. Los corchetes son usados para especificar la cantidad precisa de veces que un caracter (o secuencia de caracteres delimitada por paréntesis) debe presentarse. Dentro de estos corchetes suelen ir dos valores, usados como límite inferior y límite superior del rango. Por ejemplo, {2,} quiere decir "dos o más veces" (cuando no se ingresa el segundo valor del rango, se asume que no hay límite superior", mientras que {0,1} quiere decir "0 o 1 vez". Cabe anotar que hay otro símbolo que representa exactamente lo mismo que {0,1} y es el signo de interrogación (?).
  • El comodín "cero o más veces": *. Un asterisco es equivalente a {0,}.


Mmm, ahora que la he separado en partes, veo que la expresión regular puede simplificarse un poco. Como ya he dicho, los indicadores de límites sobran, por otra parte, las clases de caracteres no tienen mucho sentido si solo se agrupa un caracter, de modo que los corchetes cuadrados sobran también, y finalmente podría reemplazarse {0,1} con ?.

De modo que la expresión regular podría resultar en algo como:

/\\d{2,}\\.?\\d*/


Bueno, te deseo mucha suerte, y espero que puedas dedicarle un poco de tiempo al estudio de expresiones regulares, son un recurso valiosísimo, y entretenido... :)

Un cordial saludo
  #25 (permalink)  
Antiguo 20/08/2003, 01:12
Avatar de biblio  
Fecha de Ingreso: enero-2002
Ubicación: Urano
Mensajes: 577
Antigüedad: 15 años, 11 meses
Puntos: 0
Muy buena la explicación leonardop, t felicito. Creo que mejor no pudo ser para ampliar este tema sumamente importante e interesante.

En todo caso te animo a realizar un tutor sobre este tema, tienes bastante conocimiento al respecto.


Saludos
  #26 (permalink)  
Antiguo 20/08/2003, 09:30
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Y nos permites luego publicarlo en codigohispano.com...
__________________
Manoloweb
  #27 (permalink)  
Antiguo 20/08/2003, 16:20
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Cambio el c{odigo al colocarlo en el foro.

Ni que decir, luego de la clase de LeonardoP, las dudas se reducen harto bastante.

Muchas gracias por el tiempo invertido en el articulo; es buenisimo, podemos publicarlo en cualquier web?, CITANDO EL AUTOR?.

Entre mis "estudios" de PHP, cuando llegue en el manual al asunto de ereg(), que creo que es "buscar en () el caracter tal.

Fue cuando me llego ese chicharron que solo ustedes pudieron arreglar.

Sinembargo, con eso de ereg() + ereg_replace(), que ustedes saben que es "remplaze X por Y", (alguien que lea esto quizas lo desconozca).

Cree un DEBIL Script que quisiera compartir con ustedes, (a proposito de la convocatoria de Manoloweb para agrupar scripts; y que el mismo como digo, es 100% PERSONAL, por que es 100% debil, INSEGURO, Ya que si en el se utilizara ereg_replace(), pos... dejaria de funcionar.)

Recuerden que harto poquisimo de PHP yo saber, y por ello sus comentarios harto bastantisimo servirme... Lastima que el script harto insignificante util ser.... Je.

No los aburro +, creo que esto no sirve para nada + que ejercicio:

PD: Los comentarios que tiene los coloque para yo no olvidar las cosas, no para ustedes archiconocedores de estas variables y funciones.

Muchas $G por su atencion.

Última edición por RAZACALA; 20/08/2003 a las 18:43
  #28 (permalink)  
Antiguo 20/08/2003, 16:47
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Cambio el codigo al colocarlo en FDW


Última edición por RAZACALA; 20/08/2003 a las 18:48
  #29 (permalink)  
Antiguo 20/08/2003, 17:20
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Cambio el codigo al colocarlo en FDW


Última edición por RAZACALA; 20/08/2003 a las 18:47
  #30 (permalink)  
Antiguo 20/08/2003, 17:24
Usuario baneado!
 
Fecha de Ingreso: diciembre-2002
Ubicación: En mi chozita
Mensajes: 142
Antigüedad: 15 años
Puntos: 0
Cambio el codigo al colocarlo en FDW

Pues como les parce MANOLOWEB, LEONARDOP y posibles lectores/as que por mucho que intente no se pudo colocar aqui el script sin que FDW lo cambiara y por lo tanto el script diera el resultado incorrecto.

El script 100% "intacto", esta aqui: http://www.mejoramos.com/razacala/ascii.txt
DISCULPEN que halla colocado tantos post.

Como dije, solo se trata de un EJERCICIO que he hecho; el cual carece 100% de seguridad, por ello, ES SOLO PARA USO EN LOCALHOST.

Solo he querido compartirlo para escuchar comentarios.

Última edición por RAZACALA; 20/08/2003 a las 18:44
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 05:35.