Google
Web dns.bdat.net

Re: [PHP-ES] Siguiendo con las expresiones

Write haof XML files: Diego Andrés Firmenich ( dfirmenich@dgrchubut.gov.ar)
Fecha: lun 31 oct 2005 - 13:58:53 CET


Hola Robinson, disculpa que no respondi antes, el fin de semana no mire la
lista.
Bueno, yo no había probado la expresion que te mande en mi anterior
respuesta, pero era para mostrar la idea..ademas esta incompleta

> ^(( [^C] ) | (C[^A]) | (CA[^S])|(CAS[^A])).*

Fijate que en cualquier caso nunca acepta las cadenas C,CA,CAS
Hay unos espacios y unos parentesis que le cambian el sentido.
Asi que bueno, reescribi la expresion y llegue a esta:

^([^C].*)|(C[^A].*)|(CA[^S].*)|(CAS[^A].*)|(C$)|(CA$)|(CAS$)|(CASA.+)

En cualquier caso aqui te dejo una funcion que escribi.

/*
 * La intención es recibir la palabra en $palabra que no se quiere dentro de
la cadena $str,
 * la funcion arma la expresion y se fija si el parametro str es aceptado o
no por la expresion.
 */

function notIn($palabra,$str){
 $exp = "^";
 $aux ="";
 for ($i=0; $i<(strlen($palabra)); $aux.=$palabra[$i++])
  $exp .= (($i>0)?"|":"")."(".$aux."[^".$palabra[$i]."].*)" .
((strlen($aux)>0)?"|(".$aux."$)":"");

 $exp .= "|($palabra.+)";
 if ((ereg ($exp,$str,$regs))) {
   echo "La cadena no es la palabra $palabra<br>";
   for($i=0; $i < count($regs); $i++)
   echo "$i: ".$regs[$i]."<br>";
 }else
  echo "Es la palabra $palabra";
}

Lo que te queria comentar es que esta bueno, cuando no se entiende que pasa
con la expresion regular, hacer un volcado
de los subpatrones encontrados en la cadena analizada como hice ahi con ese
sencillito for.
Fijate que el numero de renglon en la salida se corresponde con el numero
de subpatron en la expresion. El indice cero es la cadena original.

Saludos
Diego Firmenich

"Robinson Andres Hernandez Salas" < rohernan@alumnos.ubiobio.cl> escribió en
el mensaje news:1130522738.4362687214e1e@alumnos.ubiobio.cl...
> Holas:
> Gracias por tu respuesta Diego.
> Probe lo que dijiste en cuanto a
>
> ^(( [^C] ) | (C[^A]) | (CA[^S])|(CAS[^A])).*
>
> En el siguiente codigo:
> if ( ereg('^(( [^C] ) | (C[^A]) | (CA[^S])|(CAS[^A])).*','COPA') ) echo
> "No es
> la palabra casa";
> else echo "Es la palabra casa";
>
> Y la respuesta que da : "Es la palabra casa"
> Porque ? no se.
>
> [^C] : una palabra que no comienze con C : FALSO para el ejemplo
> OR
> C[^A] : Que comienze con "C" y le siga algo distinto a "A" : Verdadero ...
> y
> deberia imprimir "No es la palabra casa";
>
> Pero la repuesta que da es "Es la palabra casa", realmente no entiendo
> porque.
> soy nuevo en esto de las expresiones, asi que agradeceria mucho tu ayuda.
> Me he
> leido cuanto manual he encontrado, pero todos son un asco, incluyendo el
> MAN
> REGEX, que parece haber sido escrito en chino.
>
> Gracias de antemano.
>
> El problema real es : Tengo un archivo cualquiera.html y necesito saber,
> si
> estan usando ciertas clases permitidas ( clases de CSS), en otras palabras
> seria:
>
> - Si existe la palabra class="ALGO" en el documento .html
> - Es valido solo si ese ALGO es CASA ( supondiendo que la unica clase
> valida es CASA )
>
> y yo lo traduje a buscar en el documento el patron
> class="ALGO_DISTINTO_A_CASA"
>
> La idea es que si encuentra una clase distinta a casa, que me avise.
>
> if (!ereg("^casa$","cadena"))
> echo "esta cadena no es la palabra casa";
>
> No me sirve, porque va consultando por CASA, y tambien es valido que CASA
> no
> aparesca ( que seria el caso cuando no usan class).
>
> He visto los post que hay en el manual oficial de php.net sobre regex. y
> han
> posteado varias veces el problema de exclusion de un palabra ( puesto que
> la
> exclusion de caracteres es facil ... estilo [^abc] ni a ni b ni c). Pero
> nada a
> sido util en cuanto a excluir palabras.
>
> Alguien que me ayude porfavor.

-- 
PHP Spanish Localization Talk Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


Este archivo fue generado por hypermail 2.1.7 : sáb 18 mar 2006 - 18:23:49 CET