2013/3/19 Reverse Engineer <
llar...@gmail.com>:
> Estoy extrayendo informacion de strings via expresiones regulares.
> Se trata de parte de la informacion de medicamentos del tipo:
> 1- 45 mg comp.x 30
> 2- gel x 20 g
> 3- 500 mg caps.x 16
> 4- Chocolate env.x 237 ml
>
> de la cual se ha de extraer la parte de la dosis. El resultado esperado es:
> 1- 45 mg
> 2- nada (el x indica que es volumen, no dosis)
> 3- 500 mg
> 4- nada (el x indica que es volumen, no dosis)
1) Tirale "$string str_split($string, " x ");" y agarrá el primer
elemento, así descartás todo después de la x (asumiendo que podés
asegurar que la x no aparece en otros casos). Después matcheás la
regex sobre eso.
2) Hacé un parser de verdad (o lo mínimo necesario para obtener algo similar).
No todos los problemas se solucionan con regexen, y este es uno de esos.
Aside:
Si tu regex usa mucho un caracter como / podés usar otro delimitador
(@ y # son típicos) para ahorrarte escapes:
@([0-9]{1,4}/?\.{0,1}[0-9]{0,3}).?(mg|ml|g|l|mcg|ui|mui|%|u|u/ml|g%)@i
Con un par de simplificaciones ({0,3} == {,3}, {0,1} == ?, y dos
opcionales seguidos transformados en [\/\.]? (a menos que por algún
motivo puedas tener '34/.5') (y otras cosas que asumo y cambio un
poquito):
@(\d{1,4}([/\.]\d{1,3})?).?(mg|ml|g|l|mcg|ui|mui|%|u|u/ml|g%)@i
Otros factores a tomar en cuenta en el problema son: ¿qué tan
formateados son tus datos? Si te aparecen uno por línea, como tus
ejemplos, es mucho más fácil que si quisieras capturar varios matches
en un párrafo, por ejemplo.
> los valores 2 y 4 no sirven como referencia asi que pense en negarlos con
> este patron:
> /(?<!x\
> )([0-9]{1,4}\/?\.{0,1}[0-9]{0,3}).?(mg|ml|g|l|mcg|ui|mui|\%|u|u\/ml|g\%)/i
>
> O sea, simplemente agregando el (?<!x\ ) delante del patron original.
> Obtengo resultados rarisimos:
> 1- 45 mg
> 2- 0 g (WTF)
Lo que pasa con este es simple: "dame el número que no tenga una x
directamente antes", y te da el 0, porque en vez de x antes tiene un
2.
> 3- 500 mg
> 4- 37 ml (WTF)
Idem.
>
> En el caso de los que deberian dar como resultado 'nada' o directamente no
> aparecer lo que pasa es que se 'comen' el primer caracter del indicador de
> dosis.
>
> Any ideas?
>
> --
> Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus correos
> electrónicos, envía un correo electrónico a
>
php-arg+u...@googlegroups.com.
> Para publicar una entrada en este grupo, envía un correo electrónico a
>
php...@googlegroups.com.
> Visita este grupo en
http://groups.google.com/group/php-arg?hl=es.
> Para obtener más opciones, visita
https://groups.google.com/groups/opt_out.
>
>