Foros del Web » Programando para Internet » PHP »

por favor me explicas/corriges esta expresión regular:

Estas en el tema de por favor me explicas/corriges esta expresión regular: en el foro de PHP en Foros del Web. Hola, necesito capturar el NÚMERO de programa y el NOMBRE de programa. Llevo horas intentando y solo capturo el NUMERO: Código PHP: $ARRAY [ 1 ...
  #1 (permalink)  
Antiguo 26/01/2013, 17:34
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
por favor me explicas/corriges esta expresión regular:

Hola,

necesito capturar el NÚMERO de programa y el NOMBRE de programa.

Llevo horas intentando y solo capturo el NUMERO:
Código PHP:
$ARRAY[1]='<select name="programas" class="dap" id="programas" onchange="tarzan();">
                <option value="12" selected="selected">22 aplicacion de maquinaria</option>
                <option value="13">33 prensa de papel</option>
                <option value="14">44 torno de prensa</option>
                <option value="15">55 madera y vidrio</option>
              </select>'
;
//Número de Programa y Programa del estudiante:
            
preg_match('/ue="([0-9]*)".*(option>)?/s',$ARRAY[1],$PRO);
            echo 
'<pre>'.htmlentities(print_r($PRO,1));
            exit; 
he creido que al indicar
Código:
(option>)?
le estoy indicando a la expresión regular que lo contenido en el paréntesis este presente una sola véz por medio de ? pero no me funciona.

Como pueden ver únicamente he obtenido el NUMERO DE PROGRAMA, ¿cómo capturo el NOMBRE DEL PROGRAMA?

Alguien me explica?
  #2 (permalink)  
Antiguo 26/01/2013, 18:23
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Código PHP:
Ver original
  1. preg_match('/"([0-9]+)">([^<]*)/'...
Creo que con eso tienes lo que quieres.. (si el nombre del programa es todo lo que hay dentro de los <option>..
  #3 (permalink)  
Antiguo 26/01/2013, 18:39
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Sobre tu regex, que algo esté presente 1 sola vez, no necesita ninguna sintaxis especial.Si la regex fuera /ea/, buscaria en la cadena "cada vez que aparezca ea 1 sola vez".
De hecho, la sintaxis (..)? significa que la expresión anterior es opcional.
Por lo tanto, tu regex encuentra el número del primer programa, y luego aplica el .*, que consume todo el resto de la cadena.Cuando llega al final de la cadena, haya o no haya "option>", va a hacer match, ya que está declarado como opcional.
  #4 (permalink)  
Antiguo 26/01/2013, 18:43
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

Cita:
Iniciado por dashtrash Ver Mensaje
si el nombre del programa es todo lo que hay dentro de los <option>..
Gracias DashTrash.

Cuando corro:
Código PHP:
$ARRAY[1]='<select name="programas" class="dap" id="programas" onchange="tarzan();">
                <option value="12" selected="selected">22 aplicacion de maquinaria</option>
                <option value="13">33 prensa de papel</option>
                <option value="14">44 torno de prensa</option>
                <option value="15">55 madera y vidrio</option>
              </select>'
;
//Número de Programa y Programa del estudiante:
            
preg_match('/"([0-9]+)">([^<]*)/s',$ARRAY[1],$PRO);
            echo 
'<pre>'.htmlentities(print_r($PRO,1));
            exit; 
me retorna:
Código:
Array
(
    [0] => "13">33 prensa de papel
    [1] => 13
    [2] => 33 prensa de papel
)
necesito que cpture 22 aplicacion de maquinaria y de ser posible, sin el 22, es decir: aplicacion de maquinaria.

¿puedes explicar por que el mio falla?
  #5 (permalink)  
Antiguo 26/01/2013, 18:49
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Cita:
Iniciado por Anarko Ver Mensaje
me retorna:
Código:
Array
(
    [0] => "13">33 prensa de papel
    [1] => 13
    [2] => 33 prensa de papel
)
Eso es lo que pensaba que querías.Con preg_match_all, tendrás todos los matches.

Si, además, quieres que lo que venga en el segundo grupo de captura, no incluya el número, con añadir '[^ ]+ ' delante, es bastante (consumir todo aquello que no sea un espacio, y luego, consumir un espacio)
Código PHP:
Ver original
  1. preg_match_all('/"([0-9]+)">[^ ]+ ([^<]*)/s'

Cita:
¿puedes explicar por que el mio falla?
Te lo he puesto en un post anterior.
  #6 (permalink)  
Antiguo 26/01/2013, 18:54
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

De nuevo gracias DashTrash.

Yo solo quiero capturar EL PRIMERO de ellos.

Respondiste mientras yo lo hacia.

Puedes colaborarme mas?

(solo el PRIMERO y sin los números)
  #7 (permalink)  
Antiguo 26/01/2013, 18:58
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

Disculpa DashTrash,

la XR falla:
Código PHP:
$ARRAY[1]='<select name="programas" class="dap" id="programas" onchange="tarzan();">
                <option value="12" selected="selected">22 aplicacion de maquinaria</option>
                <option value="13">33 prensa de papel</option>
                <option value="14">44 torno de prensa</option>
                <option value="15">55 madera y vidrio</option>
              </select>'
;
//Número de Programa y Programa del estudiante:
                
preg_match_all('/"([0-9]+)">[^ ]+ ([^<]*)/s',$ARRAY[1],$PRO);
            echo 
'<pre>'.htmlentities(print_r($PRO,1));
            exit; 
alguna comilla quizas?, no veo como corregirla.

Gracias
  #8 (permalink)  
Antiguo 26/01/2013, 19:03
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Ah.Ahora que sé que sólo quieres la primera, y me he fijado en esa, veo que la regexp no lo va a encontrar.Antes pensaba que los querias todas, y miré las otras.
Para hacer match de todas:

'/ue="([0-9]+)"[^>]*>[^ ]+ ([^<]*)/'

Si sólo quieres la primera, con preg_match es bastante, claro.
He añadido el prefijo que tú pusiste, ya que como se relaja las condiciones de lo que va detrás del número, refuerzo las condiciones de lo que va delante, para que no haya errores.

La regexp significa
-Obtén ue seguido de ", numeros, "
-Consume todos los caracteres que no sean '>'
-Consume '>'
-Consume todos los caracteres que no sean ' ', y luego un ' '
-Guarda todo lo que haya hasta '<' en la segunda backreference.
  #9 (permalink)  
Antiguo 26/01/2013, 19:17
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

Código PHP:
$ARRAY[1]='<select name="programas" class="dap" id="programas" onchange="tarzan();">
                <option value="12" selected="selected">22 aplicacion de maquinaria</option>
                <option value="13">33 prensa de papel</option>
                <option value="14">44 torno de prensa</option>
                <option value="15">55 madera y vidrio</option>
              </select>'
;
//Número de Programa y Programa del estudiante:
                
preg_match('/ue="([0-9]+)"[^>]*>[^ ]+ ([^<]*)/s',$ARRAY[1],$PRO);
            echo 
'<pre>'.htmlentities(print_r($PRO,1));
            exit; 
funciona PERFECTO.

Me aflije ser TAN DEBIL en el tema XR.

Algún documento REALMENTE detallado con ejemplos sobre el tema de las XR ?

Gracias DT
  #10 (permalink)  
Antiguo 26/01/2013, 19:29
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Puedes mirar en http://regexlib.com .. pero, en general, suele ayudar pensar que, en las regexes, no sólo puedes conseguir matches especificando qué quieres encontrar, sino también que *no* quieres encontrar.En la regex que te he puesto, hay tres ejemplos de eso: (no encontrar '>', no encontrar ' ', no encontrar '<').De hecho, si especificas qué es lo que no quieres encontrar (porque las cadenas donde lo vas a aplicar lo permiten), puedes tener un mejor rendimiento (por razones esotéricas que no vienen al caso).
Y, lo anterior significa que, normalmente, .* no es lo que quieres!
  #11 (permalink)  
Antiguo 27/01/2013, 09:43
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

Cita:
Iniciado por dashtrash Ver Mensaje
En la regex que te he puesto, hay tres ejemplos de eso: (no encontrar '>', no encontrar ' ', no encontrar '<')
Por favor muestras un ejemplo de cómo no encontrar una cadena.

Por ejemplo llevo mas de 50 minutos haciendo combinaciónes y no puedo imprimir únicamente la frase las vocales son aeiou
Código PHP:
    $k='las vocales son aeiou y también xyz';
    
preg_match('/(.*)[^(aeiou)]/',$k,$R);
    echo 
'<pre>';
    
print_r($R); 
y busco en NET pero no hallo un documento en español que me guie.


Y comento que escribo (.*) debido a que puede también existir esta cadena:
Código:
$k='<h5>un montón de código HTML no requerido</h5> algunas cosas en comillas
con tags y + tags...
para luego llegar a la frase anhelada que comienza con la
"palabra clave" vocáles:
<option value="las vocales son aeiou y también xyz">las vocales
son aeiou y también xyz</option>
<option value="son aeiou">las vocales son aeiou</option>
</select>
y luego otro montón de saltos de línea y TAGS inecesarios tipo</option>
</select>
y probablemente muchisimos mas OPTIONs';
A este le aplico preg_match_all, pero cómo hago el truco de no encontrar una cadena ?


Gracias.

Última edición por Anarko; 27/01/2013 a las 10:01
  #12 (permalink)  
Antiguo 27/01/2013, 17:13
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Cita:
Iniciado por Anarko Ver Mensaje
Por favor muestras un ejemplo de cómo no encontrar una cadena.

Por ejemplo llevo mas de 50 minutos haciendo combinaciónes y no puedo imprimir únicamente la frase las vocales son aeiou
Código PHP:
    $k='las vocales son aeiou y también xyz';
    
preg_match('/(.*)[^(aeiou)]/',$k,$R);
    echo 
'<pre>';
    
print_r($R); 
Lo que comentaba justo después en el otro mensaje era:
Cita:
(porque las cadenas donde lo vas a aplicar lo permiten),
A lo que me refería, es que cuando lo que quieres hacer match es algo que está dentro de un <option>, en vez de especificar que quieres encontrar "algo seguido de <option>", es mejor especificar "todo aquello que no sea <".
En este caso, aeiou (lo que delimita lo que quieres encontrar, por el lado derecho), forma parte del match que quieres encontrar.No hay un claro delimitador después de lo que quieres hacer match (a diferencia del caso "todo lo que haya dentro del option", donde el delimitador por la izquierda es '>', y por la derecha, '<').
Lo que no tengo claro en este ejemplo (sobre todo por el código que añades después), es dónde debe comenzar el match.
Aparte, la construcción [^ ..] sirve para caracteres, no para expresiones completas.Si lo que quisieras es encontrar algo *no seguido* por otra expresión, tendrías que usar x(?!y) , donde x e y son expresiones completas.
Pero , como decía, este no es tu caso, ya que quieres capturar "aeiou"
Así que, en principio, la regex que puedes usar es /(.*aeiou)/

Ahora bien, y para que veas lo "peligroso" de .*:
.* significa que *todo* hace match.Cuando pones .*, el motor de regex, siempre va a llegar al final de la linea, o del texto que le pases.
Si despúes de .*, en la regex, hay más condiciones, el motor de regex tiene que empezar a ir hacia atrás, buscando algún punto a partir del cual se cumplan el resto de las condiciones que hay detrás de .*
En tu ejemplo, la cadena:
las vocales son aeiou y también xyz

con .*aeiou, significa que el motor, primero va a hacer match de toda la linea.
Cuando ya no tiene más caracteres que consumir, finaliza la recursión de .*.Pero aún quedan condiciones que cumplir.Como no quedan caracteres, la expresión regular falla en el punto en el que está (fin de la cadena).
Así que empieza a volver atrás en la recursión (1 caracter antes del final).El motor comprueba ahora si 'z' cumple toda la regex.No la cumple.Vuelve hacia atrás.
Comprueba si yz cumple toda la regex.No la cumple.Vuelve hacia atrás.
Comprueba si xyz cumple toda la regex.No la cumple.Vuelve hacia atrás...
Así, hasta que vuelva al punto donde está "aeiou".
Ahí , finalmente, hará match.

Ésta es otra versión, más larga, de la misma regex.

/((?:.(?!aeiou))*.aeiou)/

Significa: cualquier caracter que no vaya seguido por aeiou + 1 caracter + aeiou
Es equivalente, pero, como te puedes imaginar, el número de recursiones que usa es mucho menor.
  #13 (permalink)  
Antiguo 27/01/2013, 17:27
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: por favor me explicas/corriges esta expresión regular:

Para que te hagas una idea:
Con esta cadena de entrada:

lkjlkjaeiouioookjlkjlkjlkjlkj

Mira lo que hace el motor de regex con la expresión .*aeiou

lkjlkjaeiouioookjlkjlkjlkjlkj
lkjlkjaeiouioookjlkjlkjlkjlkj backtrack
lkjlkjaeiouioookjlkjlkjlkjlk
lkjlkjaeiouioookjlkjlkjlkjlk backtrack
lkjlkjaeiouioookjlkjlkjlkjl
lkjlkjaeiouioookjlkjlkjlkjl backtrack
lkjlkjaeiouioookjlkjlkjlkj
lkjlkjaeiouioookjlkjlkjlkj backtrack
lkjlkjaeiouioookjlkjlkjlk
lkjlkjaeiouioookjlkjlkjlk backtrack
lkjlkjaeiouioookjlkjlkjl
lkjlkjaeiouioookjlkjlkjl backtrack
lkjlkjaeiouioookjlkjlkj
lkjlkjaeiouioookjlkjlkj backtrack
lkjlkjaeiouioookjlkjlk
lkjlkjaeiouioookjlkjlk backtrack
lkjlkjaeiouioookjlkjl
lkjlkjaeiouioookjlkjl backtrack
lkjlkjaeiouioookjlkj
lkjlkjaeiouioookjlkj backtrack
lkjlkjaeiouioookjlk
lkjlkjaeiouioookjlk backtrack
lkjlkjaeiouioookjl
lkjlkjaeiouioookjl backtrack
lkjlkjaeiouioookj
lkjlkjaeiouioookj backtrack
lkjlkjaeiouioook
lkjlkjaeiouioook backtrack
lkjlkjaeiouiooo
lkjlkjaeiouiooo backtrack
lkjlkjaeiouioo
lkjlkjaeiouioo backtrack
lkjlkjaeiouio
lkjlkjaeiouio backtrack
lkjlkjaeioui
lkjlkjaeioui backtrack
lkjlkjaeiou
lkjlkjaeiou backtrack
lkjlkjaeio
lkjlkjaeio backtrack
lkjlkjaei
lkjlkjaei backtrack
lkjlkjae
lkjlkjae backtrack
lkjlkja
lkjlkja backtrack
lkjlkj
lkjlkja
lkjlkjae
lkjlkjaei
lkjlkjaeio
lkjlkjaeiou
Match found
  #14 (permalink)  
Antiguo 04/02/2013, 18:29
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

Gracias DT.

Sigo muy perdido:
Código PHP:
$ARRAY[2]='<tr>
    <td colspan="3" align="center" bgcolor="#F0F0F0" class="style1">
            <input name="cocodigo" type="hidden" id="cocodigo">
        Seleccione el Programa:
        <select name="cmbprogramas" onChange="cambiar(777);">
          <option selected>Programas</option>      </select>    
            </td>
  </tr>'
;
            
preg_match_all('/option[^>]*>([^<]*)/s',$ARRAY[2],$ESTUDIANTE);
            
print_r($ESTUDIANTE); 
¿por que me imprime DOS INDICES?

Creo yo que solo deberia devolver UNO...
  #15 (permalink)  
Antiguo 04/02/2013, 19:05
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: por favor me explicas/corriges esta expresión regular:

Si vas a recorrer etiquetas y atributos HTML, te recomiendo que uses las clases DOM de PHP.

Código PHP:
Ver original
  1. $ARRAY[1]='<!doctype html><html><form><select name="programas" class="dap" id="programas" onchange="tarzan();">
  2.                <option value="12" selected="selected">22 aplicacion de maquinaria</option>
  3.                <option value="13">33 prensa de papel</option>
  4.                <option value="14">44 torno de prensa</option>
  5.                <option value="15">55 madera y vidrio</option>
  6.              </select></form></html>';
  7.  
  8. $doc = new DOMDocument();
  9. $doc->loadHTML($ARRAY[1]);
  10. $programas = $doc->getElementById('programas');
  11. $opt = $programas->getElementsByTagName('option');
  12.  
  13. foreach ($opt as $valor) {
  14.     echo $valor->nodeValue . '<br />'; //imprime contenido.
  15.     echo $valor->attributes->getNamedItem('value')->value . '<hr />'; //imprime atributo value.
  16. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #16 (permalink)  
Antiguo 04/02/2013, 20:02
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: por favor me explicas/corriges esta expresión regular:

Gracias andresdzphp lo necesito trabajar con Expresiónes Regulares.

Etiquetas: favor, html, select
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 17:35.